我需要确定日期(月和日)是否介于两个月/日之间。
我在这篇文章中附上了一张图片,描述了我正在尝试做的事情。基本上,示例“当前日期”以红色突出显示,并且介于最近的日期(3月15日和11月22日)之间。然而,当我使用Unix时间戳并人为地在日期中添加一年时,脚本认为11月22日还没有发生,因此它表明2月1日是在3月15日和11月22日之前,而不是在它们之间。所以,我需要比较日期而不使用一年。
希望这是有道理的。我只想用几个月和几天来比较日期,但是忽略了一年,并使用像我在图像中显示的轮子这样的框架。
答案 0 :(得分:4)
您的示例中的问题是(在同一年)上限日期是之前的下限。在这种情况下,任何小于上限(1月1日 - 3月14日)或大于下限(11月23日 - 12月31日)的日期都在两者之间。
<?php
$upperBound = new DateTime("Mar 15");
$lowerBound = new DateTime("Nov 22");
$checkDate = new DateTime("Feb 1");
if ($lowerBound < $upperBound) {
$between = $lowerBound < $checkDate && $checkDate < $upperBound;
} else {
$between = $checkDate < $upperBound || $checkDate > $lowerBound;
}
var_dump($between);
?>
显示器:
boolean true
如果您要检查的日期是“2月29日”且当前年份不是闰年,则DateTime会将其解释为“3月1日”。
要检查日期是否介于两个日期之间,请使用:
if ($lowerBound < $upperBound) {
$between = $lowerBound <= $checkDate && $checkDate <= $upperBound;
} else {
$between = $checkDate <= $upperBound || $checkDate >= $lowerBound;
}
答案 1 :(得分:0)
要解决此问题,您可以将日期转换为MMDD格式的4位数字。
$start = '1122';
$end = '0315';
$date = '0201';
如果您的日期格式不正确,可以使用date('md', $timestamp)
,或者只需$month * 100 + $day
来计算数字;
然后,您的测试逻辑将根据您是否跨越一年边界而改变。总而言之,它可能看起来像这样:
function isDateBetween($testM, $testD, $startM, $startD, $endM, $endD) {
$start = $startM*100 + $startD;
$end = $endM*100 + $endD;
$date = $testM*100 + $testD;
if ($start > $end) {
// crossing a year boundary
return ($date > $start) || ($date < $end);
} else {
// not crossing a year
return ($date > $start) && ($date < $end);
}
}
以下是调用此函数的一些示例:
// your example given above
isDateBetween(2, 1, 11, 22, 3, 15); // true
// ends the day after instead
isDateBetween(3, 16, 11, 22, 3, 15); // false
// reverse the dates in your example
isDateBetween(2, 1, 3, 15, 11, 22); // false
// ends the day after, with reversed dates
isDateBetween(3, 16, 3, 15, 11, 22); // true
答案 2 :(得分:-1)
//must be 2 digit month, then 2 digit day, like mm-dd
$low = '03-15';
$high = '11-22';
$date = '02-01';
$isBetween = $date >= $low && $date <= $high;
var_dump($isBetween);
我正在使用词典排序,这就是php比较字符串的方式。关键点是将最大的单位放在左边(月),并确保将每个数字段左键填充到相同的长度,使用零填充。
如果您还没有将日期作为这样格式化的字符串,则可以使用date('m-d', $timestamp)
函数来实现此目的。
答案 3 :(得分:-1)
试试这样。
<?php
$check_date= strtotime("31-Aug-1990");
$start_date= strtotime("10-Aug-2013");
$end_date= strtotime("30-Aug-1990");
if (date("M-d", $check_date)>date("M-d", $start_date) && date("M-d", $check_date)<date("M-d", $end_date))
echo "in the range";
else
echo "not in the range";
工作代码为here