如何检查日期是否在给定范围内?

时间:2009-06-10 16:18:52

标签: php date date-range

如果您有$start_date$end_date,如何检查用户提供的日期是否在此范围内?

e.g。

$start_date = '2009-06-17';

$end_date = '2009-09-05';

$date_from_user = '2009-08-28'; 

目前日期是字符串,是否有助于将它们转换为时间戳整数?

10 个答案:

答案 0 :(得分:109)

将它们转换为时间戳是可行的,使用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));
}

答案 1 :(得分: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',这样字符串比较将不等同于日期或时间戳比较。仅当字符串中的日期值采用一致 CANONICAL 格式时,此方法才有效。

编辑在此处添加注释,详细说明。

通过 CONSISTENT ,我的意思是比较的字符串必须采用相同的格式:月份必须始终为两个字符,日期必须始终为两个字符,并且分隔符必须始终做个冲刺。我们无法可靠地比较不是四个字符年,两个字符月,两个字符日的“字符串”。例如,如果我们在字符串中混合了一个字符和两个字符月,那么当我们将'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时间戳32位整数的本质。)后来的版本pf php(5.3?)应该解决这个问题。

如果您在从字符串转换为时间戳并从时间戳转换回字符串时不小心使用相同的时区,则时区也可能是一个问题。

HTH

答案 2 :(得分:41)

如果你有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);

答案 3 :(得分:4)

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

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

答案 4 :(得分:3)

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

伪代码:

if date_from_user > start_date && date_from_user < end_date
    return true

答案 5 :(得分:3)

以您提供的格式,假设用户足够聪明,可以为您提供有效日期,您无需先转换为日期,您可以将它们作为字符串进行比较。

答案 6 :(得分: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";
}

答案 7 :(得分:2)

将它们转换为日期或时间戳整数,然后检查$ date_from_user是&lt; = $ end_date和&gt; = $ start_date

答案 8 :(得分: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);

答案 9 :(得分: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

  }
}