Bekerja dengan zon waktu boleh menjadi rumit dalam pengaturcaraan.
Memandangkan PHP dimaksudkan untuk web, bahasa menyokongnya. Mari lihat mengapa anda perlu mengambil berat.
Jika anda tidak mengambil berat tentang zon waktu, anda akan mendapat pepijat lambat laun.
Ciri berkaitan masa mungkin gagal (mis., acara yang dijadualkan). Ia menjadi lebih teruk jika anda perlu berurusan dengan konsep rumit seperti Waktu Siang.
Konsep ini penting untuk e-Dagang:
Sebarang pepijat akhirnya akan menjejaskan perniagaan.
Pelaksanaan yang paling asas tetapi masih berkuasa akan serupa dengan ini:
$timeZone = new DateTimeZone('Europe/Berlin'); $date = new DateTime('now', $timeZone); echo $date->format('Y-m-d H:i:s');
Kelas DateTime terbina dalam mengambil objek DateTimeZone sebagai hujah kedua, yang akan menjejaskan operasi selanjutnya dengan objek $date.
Untuk mencari zon waktu yang sesuai, anda boleh menggunakan DateTimeZone::listIdentifiers() atau pautan ini.
DateTime menyediakan pelbagai pembantu untuk menjalankan operasi biasa pada tarikh. Perbezaan masa adalah perkara yang sangat asas, tetapi apakah yang berlaku dengan zon waktu yang berbeza?
$dateTimeNY = new DateTime('2024-08-02 01:01:01', new DateTimeZone('America/New_York')); $dateTimeBerlin = new DateTime('2024-08-02 07:01:01', new DateTimeZone('Europe/Berlin')); $interval = $dateTimeNY->diff($dateTimeBerlin); print_r($interval);// 0 everywhere
Tanpa zon waktu 'America/New_York' dan 'Eropah/Berlin', anda akan mendapat satu lagi perbezaan (6 jam), kerana PHP akan menganggap $dateTimeNY dan $dateTimeBerlin adalah dari zon waktu yang sama secara lalai.
Ia mungkin kelihatan jelas di sini, tetapi jika apl anda tidak menangkap maklumat itu dengan betul, ia boleh membawa akibat yang buruk.
Walaupun mungkin untuk menetapkan nilai khusus untuk zon waktu lalai dalam PHP, biasanya idea yang lebih baik untuk menggunakan UTC, terutamanya apabila anda mempunyai zon waktu yang berbeza untuk diurus.
UTC merujuk kepada "Epoch Unix" dan merupakan format universal.
99.9% daripada masa, adalah disyorkan untuk menyimpan tarikh anda dalam UTC.
Dengan cara ini, anda akan memastikan ia konsisten.
Perhatikan bahawa anda perlu menggunakan pembantu dan penukar terbina dalam PHP untuk memanipulasi data tersebut, tetapi semua data yang disimpan hanya akan merujuk kepada titik asal yang sama (00:00:00 UTC pada 1 Januari 1970).
Ia memudahkan operasi biasa seperti perbandingan dan pengisihan. Jika tidak, anda mungkin akan mendapat nilai yang kelihatan sama tetapi tidak berada pada garis dasar yang sama secara tersirat.
GMT bermaksud Waktu Purata Greenwich dan pernah menjadi tunjang zon waktu.
Secara teknikalnya, UTC dan GMT menunjukkan masa yang sama, tetapi UTC lebih tepat (jam atom) dan lebih konsisten (tiada Waktu Siang).
Tidak seperti UTC, GMT ialah zon waktu. Anda mungkin pernah melihatnya beraksi dengan setiap zon waktu menambah atau menolak jam daripada GMT+0.
Ini adalah kedua-dua piawaian masa untuk tujuan yang agak serupa, tetapi UTC lebih canggih.
Menurut pelbagai sumber, ia disingkatkan "UTC" kerana, jika tidak, ia akan menjadi "CUT" dalam bahasa Inggeris ("Coordinated Universal Time") dan "TUC" dalam bahasa Perancis ("Temps Universel Coordonné").
Zulu ialah piawaian masa yang digunakan terutamanya oleh ketenteraan dan perkara berkaitan syarikat penerbangan.
"Zulu" bermaksud "Sifar meridian longitud," yang agak sama dengan GMT, tetapi tentera dan penerbang menggunakan abjad fonetik dan bukannya huruf.
Ia bukan konsep kritikal (tidak seperti UTC), tetapi ia bagus untuk diketahui, dan jika anda benar-benar memerlukan format itu, PHP menyokongnya:
Y-m-d\TH:i:sp
Konsep "zon masa" hanya mengambil kira manusia, bukan mesin dan program.
Kerajaan boleh mengubah suai "tetapan masa". Contohnya, offset UTC atau pematuhan DST (Waktu Siang) boleh berbeza-beza.
Banyak acara lain boleh menjejaskan masa global. Satu lagi sebab yang baik untuk menggunakan format universal UTC dan penukar piawai untuk berfungsi dengan zon waktu dalam pengaturcaraan.
Karbon ialah satu set pembantu yang dibina di atas objek DateTime asli.
Akibatnya, Karbon menyokong zon waktu:
$tomorrow = Carbon::now()->tomorrow()->tz('Europe/Berlin');
Jika anda menggunakan rangka kerja seperti Laravel, pakej Carbon sudah dipasang.
Waktu Siang atau Daylight Saving Time (DST) ialah konsep kritikal untuk banyak apl.
Ringkasnya, orang ramai menukar jam untuk memanfaatkan cahaya siang dengan lebih baik.
Ia berlaku kerana cahaya siang biasanya lebih panjang pada musim panas (bukan di mana-mana). Itulah sebabnya orang memajukan jam dan menetapkan jam kembali pada musim luruh, apabila siang hari semakin pendek.
Dalam erti kata lain, DST berkaitan dengan waktu matahari terbit dan terbenam, yang boleh menjadi sangat berbeza di seluruh dunia.
Anda boleh mendapatkan semula variasi tersebut dengan menggunakan getTransitions():
$timezone = new DateTimeZone('Europe/Berlin'); $transitions = $timezone->getTransitions(); print_r($transitions);
If you use the latest version of PHP, you will not get this specific bug, but your case can be a known issue.
Read reported bugs and issues, as it might prevent some headaches.
Atas ialah kandungan terperinci PHP: Memahami Zon Masa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!