如何在夏令時調整期間計算日期差異(用於計算班次的函數)?
P粉919464207
P粉919464207 2023-09-16 00:03:57
0
1
464

我有以下的函數用於確定給定日期上的哪個班次在工作。

public static function getShift($date, $startDate, $sequence)
    {
        $daysDiff = floor((strtotime($date) - strtotime($startDate)) / (60 * 60 * 24));
        $sequenceArray = explode(',', $sequence);
        $key = ($daysDiff % count($sequenceArray)) + 1;
        return $sequenceArray[$key - 1];
    }

它的呼叫方式如下:

$shift = ShiftHelper::getShift($date, '3/14/2023', '1,2,3,4');

如果我使用兩個不跨越夏令時的日期,它似乎工作正常。例如,3/14/2023和6/22/23返回1(正確的)。但是如果我跨越夏令時發生的那一天,例如3/10/23和6/22/23,它回傳4,這是錯誤的班次。

我該如何使它在不擔心夏令時的情況下工作?

P粉919464207
P粉919464207

全部回覆(1)
P粉323224129

這是因為您的計算是基於一天有一定秒數而不是「天數」。我敢打賭,在大多數時區中,但不是所有時區,這會使時間稍微變動,以至於越過邊界並改變轉換數字。我還敢打賭,@aaronfc所在的時區不會這樣,或者他的預設時區設定為UTC或其他靜態偏移量。

DateTime函式庫可以可靠地計算:

function getShift($date, $startDate, $sequence) {
    $epoch = DateTime::createFromFormat('m/d/Y', $startDate)->setTime(0,0,0);
    $cur   = DateTime::createFromFormat('m/d/Y', $date)->setTime(0,0,0);
    $daysDiff = date_diff($epoch, $cur)->days;
    
    $sequenceArray = explode(',', $sequence);
    $key = ($daysDiff % count($sequenceArray)) + 1;
    return $sequenceArray[$key - 1];
}

var_dump(
    getShift('6/22/2023', '3/14/2023', '1,2,3,4'),
    getShift('6/22/2023', '3/10/2023', '1,2,3,4')
);

輸出:

string(1) "1"
string(1) "1"

我還建議將explode(',', $sequence)移出函數,這樣函數就不需要知道如何解碼任意字串。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!