簡體   English   中英

找出日期是否在兩個日期之間,忽略年份

[英]Find out if date is between two dates, ignoring year

我需要確定日期(月和日)是否在兩個月/日之間。

我在這篇文章中附上了一張圖片,描述了我正在嘗試做的事情。 基本上,示例“當前日期”以紅色突出顯示,並且介於最近的日期(3月15日和11月22日)之間。 然而,當我使用Unix時間戳並人為地在日期中添加一年時,腳本認為11月22日還沒有發生,因此它表明2月1日是在3月15日和11月22日之前,而不是在它們之間。 所以,我需要比較日期而不使用一年。

希望這是有道理的。 我只想比較幾個月和幾天的日期,但忽略了一年,並使用像我在圖像中顯示的輪子這樣的框架。

確定日期是否介於兩個日期之間

您的示例中的問題是(在同一年)上限日期下限之前 在這種情況下,任何小於上限(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;
}

要解決此問題,您可以將日期轉換為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 
//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)函數來實現。

試試這樣吧。

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

工作代碼在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM