2009-06-10 159 views
64

如果您有$start_date$end_date,如何檢查用戶提供的日期是否在該範圍內?如何檢查日期是否在給定範圍內?

例如

$start_date = '2009-06-17'; 

$end_date = '2009-09-05'; 

$date_from_user = '2009-08-28'; 

現在日期是字符串,它會幫助將它們轉換爲時間戳整數?

+0

這將幫助,那麼你可以訪問任何日期操作功能也有。 – ChrisF 2009-06-10 16:22:41

+3

因爲Unix時間戳記是在1970年1月1日(1970-01-01)的時代開始,所以你可以在1970年之前對測試日期進行有趣的行爲。 – 2009-06-10 16:26:52

+1

@Shadi你知道有這樣的事情,比如負數,對吧? – 2009-06-11 06:33:31

回答

96

使用strtotime將它們轉換爲時間戳是正確的方法,例如

$start_date = '2009-06-17'; 

$end_date = '2009-09-05'; 

$date_from_user = '2009-08-28'; 

check_in_range($start_date, $end_date, $date_from_user); 


function check_in_range($start_date, $end_date, $date_from_user) 
{ 
    // Convert to timestamp 
    $start_ts = strtotime($start_date); 
    $end_ts = strtotime($end_date); 
    $user_ts = strtotime($date_from_user); 

    // Check that user date is between start & end 
    return (($user_ts >= $start_ts) && ($user_ts <= $end_ts)); 
} 
2

將它們轉換成日期或時間戳記整數,然後只檢查$ date_from_user是< = $ END_DATE和> = $起始日期

+3

您能澄清「將它們轉換爲日期」嗎?你會怎麼做?我認爲PHP沒有日期類型? – meleyal 2009-06-10 16:25:09

3

都轉換日期戳,然後做

僞代碼:

if date_from_user > start_date && date_from_user < end_date 
    return true 
+0

您可能需要對其進行編輯,以便在範圍中包含start_date和end_date。現在,如果date_from_user等於兩者,則不會被計算在內。 – TheTXI 2009-06-10 16:24:45

+0

OP沒有指定包含範圍或獨佔範圍,所以我會讓他們選擇使用哪種策略 – Glen 2009-06-10 16:27:50

4
$startDatedt = strtotime($start_date) 
$endDatedt = strtotime($end_date) 
$usrDatedt = strtotime($date_from_user) 

if($usrDatedt >= $startDatedt && $usrDatedt <= $endDatedt) 
{ 
    //..falls within range 
} 
+0

這不包括與開始日期或結束日期 – TheTXI 2009-06-10 16:25:31

46

這是沒有必要轉換成時間戳做比較,因爲串被驗證爲「YYYY-MM-DD」規範格式的日期。

此測試將工作:

(($date_from_user >= $start_date) && ($date_from_user <= $end_date)) 

給出:

$start_date  = '2009-06-17'; 
$end_date  = '2009-09-05'; 
$date_from_user = '2009-08-28'; 

注:比較字符串這樣確實允許 「非有效」 日期如(12月32日)'2009-13-32'以及格式不正確的字符串'2009/3/3',這樣字符串比較不會等同於日期或時間戳比較。這僅適用於字符串中的日期值爲CONSISTENTCANONICAL格式。

編輯在這裏添加一個註釋,詳細闡述。

通過一致的,我的意思是比如被比較字符串必須是相同的格式爲:每月必須始終是兩個字符,這一天必須是兩個字符,分隔符必須是一個破折號。我們不能可靠地比較不是四個字符年,兩個字符月,兩個字符日的「字符串」。例如,如果我們在字符串中混合使用了一個字符和兩個字符月份,那麼當我們比較'2009-9-30''2009-10-11'時,我們會得到意想不到的結果。我們人爲地將「9」看作小於「10」,但字符串比較將看到'2009-9'大於'2009-1'。我們不一定需要有一個破折號分隔符字符;我們可以可靠地比較'YYYYMMDD'格式的字符串;如果有分隔符,它必須始終在那裏並且始終保持相同。

通過CANONICAL,我的意思是一種格式,將導致將按日期順序排序的字符串。也就是說,該字符串將首先具有「年」的表示,然後是「月」,然後是「日」。我們無法可靠地比較'MM-DD-YYYY'格式的字符串,因爲這不是規範。字符串比較將比較MM(月),然後比較YYYY(年),因爲字符串比較從左到右起作用。)'YYYY-MM-DD'字符串格式的一大優點是它是規範的;以這種格式表示的日期可以可靠地作爲字符串比較。

[附錄]

如果你去爲PHP時間戳轉換,要注意的限制。

在某些平臺上,php不支持早於1970-01-01和/或晚於2038-01-19的時間戳值。 (這是unix timestamp 32位整數的本質。)後來的版本pf php(5.3?)應該解決這個問題。

如果您在從字符串轉換爲時間戳和從時間戳轉換回字符串時不小心使用相同的時區,則時區也可能成爲問題。

HTH

3

在您所提供的格式,假設用戶是足夠聰明,給你的有效日期,您不需要轉換成日期第一,你可以把它們比爲字符串。

3
$start_date="17/02/2012"; 
$end_date="21/02/2012"; 
$date_from_user="19/02/2012"; 

function geraTimestamp($data) 
{ 
    $partes = explode('/', $data); 
    return mktime(0, 0, 0, $partes[1], $partes[0], $partes[2]); 
} 


$startDatedt = geraTimestamp($start_date); 
$endDatedt = geraTimestamp($end_date); 
$usrDatedt = geraTimestamp($date_from_user); 

if (($usrDatedt >= $startDatedt) && ($usrDatedt <= $endDatedt)) 
{ 
    echo "Dentro"; 
}  
else 
{ 
    echo "Fora"; 
} 
36

如果您有PHP 5.3+,請使用DateTime類。更易於使用,更好的功能。

DateTime內部支持時區,其他解決方案由您來處理。

<?php  
/** 
* @param DateTime $date Date that is to be checked if it falls between $startDate and $endDate 
* @param DateTime $startDate Date should be after this date to return true 
* @param DateTime $endDate Date should be before this date to return true 
* return bool 
*/ 
function isDateBetweenDates(DateTime $date, DateTime $startDate, DateTime $endDate) { 
    return $date > $startDate && $date < $endDate; 
} 

$fromUser = new DateTime("2012-03-01"); 
$startDate = new DateTime("2012-02-01 00:00:00"); 
$endDate = new DateTime("2012-04-30 23:59:59"); 

echo isDateBetweenDates($fromUser, $startDate, $endDate); 
1

你可以試試這個:

//custom date for example 
$d1 = new DateTime("2012-07-08"); 
$d2 = new DateTime("2012-07-11"); 
$d3 = new DateTime("2012-07-08"); 
$d4 = new DateTime("2012-07-15"); 

//create a date period object 
$interval = new DateInterval('P1D'); 
$daterange = iterator_to_array(new DatePeriod($d1, $interval, $d2)); 
$daterange1 = iterator_to_array(new DatePeriod($d3, $interval, $d4)); 
array_map(function($v) use ($daterange1) { if(in_array($v, $daterange1)) print "Bingo!";}, $daterange); 
0

我發現這個方法最簡單的:

$start_date = '2009-06-17'; 
$end_date = '2009-09-05'; 
$date_from_user = '2009-08-28'; 

$start_date = date_create($start_date); 
$date_from_user = date_create($date_from_user); 
$end_date = date_create($end_date); 

$interval1 = date_diff($start_date, $date_from_user); 
$interval2 = date_diff($end_date, $date_from_user); 

if($interval1->invert == 0){ 
    if($interval2->invert == 1){ 

    // if it lies between start date and end date execute this code 

    } 
} 
相關問題