找出日期是否在两个日期之间,忽略年份

问题描述 投票:0回答:5

我需要确定日期(月和日)是否在另外两个月/日之间。

我在这篇文章中附上了一张图片,描述了我正在尝试做的事情。基本上,示例“当前日期”以红色突出显示,并且它位于最近的日期(3 月 15 日和 11 月 22 日)之间。然而,当我使用 Unix 时间戳并人为地在日期中添加一年时,脚本认为 11 月 22 日尚未发生,因此它表明 2 月 1 日在 3 月 15 日和 11 月 22 日之前,而不是在它们之间。所以,我需要比较日期而不使用年份。

希望这是有道理的。我只想使用月份和日期来比较日期,但忽略年份,并使用像图中所示的轮子这样的框架。

Determine if date falls between two dates

php date
5个回答
6
投票

您的示例中的问题是(在同一年)上限日期早于下限。在这种情况下,任何小于上限(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

编辑

如果您要检查的日期是“Feb 29”并且当前年份不是闰年,则 DateTime 将其解释为“Mar 1”。

要检查日期是否介于两个日期之间(包括这两个日期),请使用:

if ($lowerBound < $upperBound) {
    $between = $lowerBound <= $checkDate && $checkDate <= $upperBound;
} else {
    $between = $checkDate <= $upperBound || $checkDate >= $lowerBound;
}

1
投票

要解决此问题,您可以将日期转换为 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 

0
投票

这是我根据 Roy M 提出的关于使用一年中的某一天的想法做出的贡献。我的查询是检查日期是否发生在跨越一年变化的冬季期间。

private function isWinter(int $dateStr):bool {
    $input = date('z',$dateStr);

    // 2001 was NOT a leap year
    // Is $input between 27/10 and 30/3 (a winter period)
    $startDOY = date('z',strtotime('2001-10-27'));      

    $endDOY = date('z',strtotime('2001-3-30'));

    if (date('L',$dateStr)) {
        $startDOY--;
        $endDOY--;
    }

return $input <= $endDOY || $input >= $startDOY;
}

-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";

工作代码是这里


-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)
函数来实现。

© www.soinside.com 2019 - 2024. All rights reserved.