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?
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:
Keluaran:
Saya juga mengesyorkan untuk mengalihkan
explode(',', $sequence)
keluar daripada fungsi supaya fungsi tidak perlu tahu cara menyahkod rentetan sewenang-wenangnya.