Rumah > Soal Jawab > teks badan
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粉3232241292023-09-16 12:53:26
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.