PHP日期范围没有年份。如何处理12月/ 1月的环回

时间:2015-08-21 20:48:46

标签: php

我有用户定义的日期范围。例如,日期范围可以是11月8日至3月26日。我需要确定给定日期(没有年份)是否在这些范围之一之间。我不想包括年份,因为用户定义的日期范围是每年的递归。

我的问题是我不知道如何处理12月31日到1月1日之间的回调。我猜测一个PHP DatePeriod对象是可行的方法,但我怎样才能排除它的年份?如果我有一个12月10日到2月15日的日期范围,如何在不指定年份的情况下确定1月11日是否在该范围内?

3 个答案:

答案 0 :(得分:1)

由于年份无关紧要,因此在比较日期时,请使用一年,并始终使用该年份。这样做可以让您在检查测试日期是否在范围内时创建有效的DateTime对象:

$constYear = '2000';
$dateStart = new DateTime($constYear . '-12-10');//December 10
$dateEnd = new DateTime($constYear . '-02-15');//February 15
$dateTest = new DateTime($constYear . '-01-11');//January 11
$isDateTestInRange = false;

if($dateTest > $dateStart && $dateTest < $dateEnd) {
  $isDateTestInRange = true;
}

请务必不要考虑使用这些变量($dateStart, $dateEnd, $dateText)的年份,因为它将包含此常量$constYear(仅用于创建有效日期)。

答案 1 :(得分:0)

经过多次搜索,我找到了一个解决方案的线程......对于任何有兴趣的人都是这样......

Find out if date is between two dates, ignoring year

答案 2 :(得分:0)

如果你真的没有处理多年的事情,那么一个人(根据binnyb's answer)就可以了。诀窍是添加逻辑来测试开始日期是否在结束日期之后 - 表明它们来自不同年份。

一个示例解决方案(基于多年来类似问题的答案):

// For convenience, build MM-DD strings
$date1 = "11-8";
$date2 = "03-26";
$test = "01-15";

if (check_in_range($date1, $date2, $test)) echo "in range!";

function check_in_range($start_date, $end_date, $test_date)
{
    $year = '2000';

    $start_ts = strtotime($year.'-'.$start_date);
    $end_ts = strtotime($year.'-'.$end_date);
    $test_ts = strtotime($year.'-'.$test_date);

    if ($start_ts > $end_ts) {
      $year -= 1;
      $start_ts = strtotime($year.'-'.$start_date);
    }

    return (($test_ts >= $start_ts) && ($test_ts <= $end_ts));
}