PHP: Memahami Zon Masa

王林
Lepaskan: 2024-08-06 03:40:41
asal
689 orang telah melayarinya

PHP: Understanding Time Zones

Bekerja dengan zon waktu boleh menjadi rumit dalam pengaturcaraan.

Memandangkan PHP dimaksudkan untuk web, bahasa menyokongnya. Mari lihat mengapa anda perlu mengambil berat.

Mengapa perlu bersusah payah dengan zon waktu?

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:

  • ketersediaan produk
  • diskaun
  • penghantaran

Sebarang pepijat akhirnya akan menjejaskan perniagaan.

Bermula dengan zon waktu dalam PHP

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');
Salin selepas log masuk

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.

Perbezaan masa merentas zon waktu

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
Salin selepas log masuk

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.

Gunakan UTC, "selalu"

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 lwn. UTC

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é").

Apa itu "Zulu"?

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
Salin selepas log masuk

Masa boleh berubah

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 & zon masa

Karbon ialah satu set pembantu yang dibina di atas objek DateTime asli.

Akibatnya, Karbon menyokong zon waktu:

$tomorrow = Carbon::now()->tomorrow()->tz('Europe/Berlin');
Salin selepas log masuk

Jika anda menggunakan rangka kerja seperti Laravel, pakej Carbon sudah dipasang.

Cara mengurus Waktu Siang

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);
Salin selepas log masuk

Known bugs in PHP

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.

Useful links

  • What time is it?
  • PHP doc - Time zones
  • PHP doc - getTransitions()
  • Daylight Time
  • PHP engineer - time zones
  • Military time

Atas ialah kandungan terperinci PHP: Memahami Zon Masa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan