Bagaimana untuk mengira perbezaan tarikh (fungsi yang digunakan untuk mengira syif) semasa pelarasan masa penjimatan siang?
P粉919464207
P粉919464207 2023-09-16 00:03:57
0
1
463

Saya mempunyai fungsi berikut untuk menentukan syif mana yang berfungsi pada tarikh tertentu.

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];
    }

Ia dipanggil seperti berikut:

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

Jika saya menggunakan dua kurma yang tidak menjangkau waktu siang hari, ia nampaknya berfungsi dengan baik. Contohnya, 14/3/2023 dan 22/6/23 mengembalikan 1 (betul). Tetapi jika saya menjangkau hari di mana masa penjimatan siang berlaku, seperti 3/10/23 dan 6/22/23, ia mengembalikan 4, iaitu anjakan yang salah.

Bagaimanakah cara saya membuatnya berfungsi tanpa perlu risau tentang masa penjimatan siang?

P粉919464207
P粉919464207

membalas semua(1)
P粉323224129

Ini kerana pengiraan anda adalah berdasarkan bilangan saat dalam sehari dan bukannya "bilangan hari". Saya berani bertaruh bahawa dalam kebanyakan zon waktu, tetapi bukan semua, ini akan mengubah masa dengan sedikit sehingga ia akan melintasi sempadan dan menukar nombor penukaran. Saya juga yakin bahawa zon waktu @aaronfc tidak berfungsi seperti ini, atau zon waktu lalainya ditetapkan kepada UTC atau beberapa offset statik lain.

Pustaka DateTime boleh mengira dengan pasti:

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')
);

Keluaran:

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

Saya juga mengesyorkan untuk mengalihkan explode(',', $sequence)keluar daripada fungsi supaya fungsi tidak perlu tahu cara menyahkod rentetan sewenang-wenangnya.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!