[英]How to check if a date is in a given range?
如果您有$start_date
和$end_date
,那么如何檢查用戶給出的日期是否在該范圍內?
例如
$start_date = '2009-06-17';
$end_date = '2009-09-05';
$date_from_user = '2009-08-28';
目前日期是字符串,是否有助於將它們轉換為時間戳整數?
將它們轉換為時間戳是可行的,使用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));
}
沒有必要轉換為時間戳來進行比較,因為字符串被驗證為“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',這樣字符串比較將不等同於日期或時間戳比較。 僅當字符串中的日期值采用CONSISTENT和CANONICAL格式時,此方法才有效。
編輯在這里添加注釋,詳細闡述。
通過CONSISTENT ,我的意思是例如被比較的字符串必須采用相同的格式:月份必須始終為兩個字符,日期必須始終為兩個字符,分隔符必須始終為破折號。 我們無法可靠地比較不是四個字符年,兩個字符月,兩個字符日的“字符串”。 例如,如果我們在字符串中混合使用一個字符和兩個字符,那么當我們將'2009-9-30'
與'2009-10-11'
進行比較時,我們會得到意想不到的結果。 我們人性地認為“9”小於“10”,但字符串比較將看到'2009-9'
大於'2009-1'
。 我們不一定需要一個破折號分隔符; 我們可以可靠地比較'YYYYMMDD'
格式的字符串; 如果有一個分隔符,它必須始終存在並始終相同。
通過CANONICAL ,我的意思是一種格式,它將導致字符串按日期順序排序。 也就是說,字符串首先表示“年”,然后是“月”,然后是“日”。 我們無法可靠地比較'MM-DD-YYYY'
格式的字符串,因為這不是規范的。 字符串比較將比較YYYY
(年)之前的MM
(月份),因為字符串比較從左到右工作。)'YYYY-MM-DD'字符串格式的一大好處是它是規范的; 以這種格式表示的日期可以可靠地比較為字符串。
[附錄]
如果您確實要進行php時間戳轉換,請注意這些限制。
在某些平台上,php不支持早於1970-01-01和/或晚於2038-01-19的時間戳值。 (這是unix時間戳32位整數的本質。)后來的版本pf php(5.3?)應該解決這個問題。
如果在從字符串轉換為時間戳並從時間戳轉換回字符串時不小心使用相同的時區,則時區也可能是個問題。
HTH
如果你有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);
$startDatedt = strtotime($start_date)
$endDatedt = strtotime($end_date)
$usrDatedt = strtotime($date_from_user)
if( $usrDatedt >= $startDatedt && $usrDatedt <= $endDatedt)
{
//..falls within range
}
$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";
}
然后將兩個日期轉換為時間戳
偽代碼:
if date_from_user > start_date && date_from_user < end_date
return true
在您提供的格式中,假設用戶足夠聰明地為您提供有效日期,您不需要先轉換為日期,您可以將它們作為字符串進行比較。
將它們轉換為日期或時間戳整數,然后檢查$ date_from_user是否為<= $ end_date和> = $ start_date
你可以試試這個:
//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);
我發現這種方法最簡單:
$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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.