我有用户定义的日期范围。例如,日期范围可以是11月8日至3月26日。我需要确定给定日期(没有年份)是否在这些范围之一之间。我不想包括年份,因为用户定义的日期范围是每年的递归。
我的问题是我不知道如何处理12月31日到1月1日之间的回调。我猜测一个PHP DatePeriod对象是可行的方法,但我怎样才能排除它的年份?如果我有一个12月10日到2月15日的日期范围,如何在不指定年份的情况下确定1月11日是否在该范围内?
答案 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)
经过多次搜索,我找到了一个解决方案的线程......对于任何有兴趣的人都是这样......
答案 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));
}