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

mel*_*yal 75 php date date-range

如果您有,$start_date并且$end_date,如何检查用户给出的日期是否在该范围内?

例如

$start_date = '2009-06-17';

$end_date = '2009-09-05';

$date_from_user = '2009-08-28'; 
Run Code Online (Sandbox Code Playgroud)

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

Con*_*oyP 111

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


spe*_*593 47

没有必要转换为时间戳来进行比较,因为字符串被验证为"YYYY-MM-DD"规范格式的日期.

该测试将起作用:

( ( $date_from_user >= $start_date ) && ( $date_from_user <= $end_date ) )
Run Code Online (Sandbox Code Playgroud)

给定:

$start_date     = '2009-06-17';
$end_date       = '2009-09-05';
$date_from_user = '2009-08-28';
Run Code Online (Sandbox Code Playgroud)

注意:比较像这样的字符串确实允许"无效"日期,例如(12月32日)'2009-13-32'和格式奇怪的字符串'2009/3/3',这样字符串比较将不等同于日期或时间戳比较.仅当字符串中的日期值采用CONSISTENTCANONICAL格式时,此方法才有效.

编辑在这里添加注释,详细阐述.

通过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

  • 您可以使用checkdate()进行验证 (2认同)

old*_*ard 42

如果你有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);
Run Code Online (Sandbox Code Playgroud)

  • 我总是喜欢“DateTime”而不是 PHP 提供的开箱即用的粗略时间函数。要在此检查中包含开始和结束日期,只需将返回值更改为 `return $date &gt;= $startDate &amp;&amp; $date &lt;= $endDate;` (2认同)