如何检查date是否在给定的范围内?

如果您有$start_date$end_date ,您如何检查用户给定的date是否在该范围内?

例如

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

目前的date是string,是否有助于将它们转换为时间戳整数?

将它们转换为时间戳是使用时间的方法,例如

 $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)); } 

假设string被validation为'YYYY-MM-DD'规范格式的date,则不需要转换为时间戳进行比较。

这个testing将起作用:

 ( ( $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'; 

注意:像这样比较string确实允许“非有效”date,例如(2009年12月32日)“2009-13-32”和奇怪格式的string“2009/3/3”,这样string比较不等于date或时间戳比较。 只有在string中的date值是一个CONSISTENTCANONICAL格式时才可以使用

编辑在这里添加一个笔记,详细阐述。

通过CONSISTENT ,我的意思是,比较的string必须是相同的格式:月份必须是两个字符,date必须是两个字符,分隔符必须是短划线。 我们不能可靠地比较不是四个字符年,两个字符月份,两个字符日的“string”。 例如,如果我们在string中混合了一个字符和两个字符的月份,那么当我们比较'2009-9-30''2009-10-11'时,我们会得到意想不到的结果。 我们人为地将“9”看作小于“10”,但是string比较将看到'2009-9'大于'2009-1' 。 我们不一定需要有一个破折号分隔符字符; 我们可以可靠地比较'YYYYMMDD'格式的string。 如果有分隔符,它必须始终在那里,并且始终是相同的。

通过CANONICAL ,我的意思是一种格式,将导致将按date顺序sorting的string。 也就是说,string首先会有“年”的表示,然后是“月”,然后是“日”。 我们无法可靠地比较'MM-DD-YYYY'格式的string,因为这不是规范的。 string比较比较MM (月份)之前它比较YYYY (年),因为string比较工作从左到右)。'YYYY-MM-DD'string格式的一大好处是它是规范的; 以这种格式表示的date可以可靠地作为string比较。

[附录]

如果你确实去php时间戳转换,请注意限制。

在某些平台上,php不支持早于1970-01-01和/或晚于2038-01-19的时间戳值。 (这是unix时间戳32位整数的本质。)更高版本的PHP(5.3?)应该解决这个问题。

时区也可能是一个问题,如果在从string转换为时间戳和从时间戳转换回string时不小心使用相同的时区。

HTH

如果您有PHP 5.3+,请使用DateTime类。 更易于使用,更好的function。

DateTime内部支持时区,其他解决scheme由您来处理。

 <?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 } 

将两个date转换为时间戳,然后执行

伪代码:

 if date_from_user > start_date && date_from_user < end_date return true 

在你提供的格式中,假设用户足够聪明,可以给你有效的date,你不需要首先转换为date,你可以将它们作为string进行比较。

 $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"; } 

将它们转换成date或时间戳整数,然后检查$ 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 } }