Saya berharap untuk membuat pertanyaan ini dan jawaban untuk itu panduan definitif untuk berurusan dengan waktu musim panas, khususnya untuk berurusan dengan perubahan perubahan yang sebenarnya.
Jika Anda memiliki sesuatu untuk ditambahkan, silakan lakukan
Banyak sistem bergantung pada menjaga waktu yang akurat, masalahnya adalah perubahan waktu karena penghematan siang hari - menggerakkan jam maju atau mundur.
Misalnya, seseorang memiliki aturan bisnis dalam sistem pengambilan pesanan yang bergantung pada waktu pesanan - jika jam berubah, aturan mungkin tidak sejelas ini. Bagaimana seharusnya waktu pesanan dipertahankan? Tentu saja ada banyak skenario yang tak ada habisnya - yang ini hanyalah ilustrasi.
- Bagaimana Anda menangani masalah penghematan siang hari?
- Asumsi apa yang merupakan bagian dari solusi Anda? (mencari konteks di sini)
Sama pentingnya, jika tidak lebih dari itu:
- Apa yang Anda coba yang tidak berhasil?
- Mengapa itu tidak berhasil?
Saya akan tertarik pada pemrograman, OS, kegigihan data dan aspek terkait lainnya dari masalah ini.
Jawaban umum sangat bagus, tetapi saya juga ingin melihat detail terutama jika hanya tersedia pada satu platform.
GETDATE()
pada SQL akan menjadi UTC (seperti yang akanDateTime.Now
). Dan server tidak akan terpengaruh oleh perubahan DST otomatis apa pun.DateTime.UtcNow
danGETUTCDATE()
, itu juga menunjukkan pengembang lain bahwa Anda benar-benar memikirkannyaJawaban:
Ringkasan jawaban dan data lain: (silakan tambahkan milik Anda)
Melakukan:
datetimeoffset
jenis yang dapat menyimpan keduanya dalam satu bidang tunggal.1970-01-01T00:00:00Z
(tidak termasuk detik kabisat). Jika Anda membutuhkan presisi lebih tinggi, gunakan milidetik saja. Nilai ini harus selalu didasarkan pada UTC, tanpa penyesuaian zona waktu.DateTimeOffset
seringkali merupakan pilihan yang lebih baik daripadaDateTime
.DateTime
, danDateTimeZone
kelas. Hati-hati saat menggunakanDateTimeZone::listAbbreviations()
- lihat jawaban . Untuk menjaga agar PHP selalu mendapatkan data terbaru Olson, instal paket PECL timezonedb secara berkala ; lihat jawabannya .>=
,<
).Jangan:
America/New_York
dengan "zona waktu offset", seperti-05:00
. Mereka adalah dua hal yang berbeda. Lihat wiki tag zona waktu .Date
untuk melakukan perhitungan tanggal dan waktu di browser web yang lebih lama, karena ECMAScript 5.1 dan yang lebih rendah memiliki cacat desain yang dapat menggunakan waktu musim panas secara salah. (Ini diperbaiki dalam ECMAScript 6/2015).Pengujian:
Referensi:
timezone
Halaman wiki tag terperinci di Stack Overflowdst
timezone
Lain:
sumber
Saya tidak yakin apa yang dapat saya tambahkan ke jawaban di atas, tetapi berikut adalah beberapa poin dari saya:
Jenis kali
Ada empat waktu berbeda yang harus Anda pertimbangkan:
Ada juga waktu bersejarah / alternatif. Ini menjengkelkan karena mereka mungkin tidak memetakan kembali ke waktu standar. Contoh: Tanggal Julian, tanggal menurut kalender Lunar di Saturnus, kalender Klingon.
Menyimpan cap waktu mulai / berakhir di UTC berfungsi dengan baik. Untuk 1, Anda memerlukan nama zona waktu acara + offset yang disimpan bersama dengan acara tersebut. Untuk 2, Anda memerlukan pengidentifikasi waktu lokal yang disimpan dengan masing-masing wilayah dan nama zona waktu lokal + offset yang disimpan untuk setiap pengunjung (dimungkinkan untuk menurunkan ini dari IP jika Anda berada dalam krisis). Selama 3, simpan dalam UTC detik dan tidak perlu zona waktu. 4 adalah kasus khusus 1 atau 2 tergantung pada apakah itu acara global atau lokal, tetapi Anda juga perlu menyimpan yang dibuat di stempel waktu sehingga Anda dapat mengetahui apakah definisi zona waktu berubah sebelum atau setelah acara ini dibuat. Ini diperlukan jika Anda perlu menampilkan data historis.
Menyimpan waktu
Offset dan nama
Contoh di atas adalah:
Dengan informasi ini, kami secara historis dapat menentukan waktu yang tepat ketika final WCS 2010 berlangsung bahkan jika definisi zona waktu Afrika Selatan berubah, dan dapat menampilkannya kepada pemirsa di zona waktu lokal mereka pada saat mereka menanyakan database.
Waktu sistem
Anda juga perlu menyimpan file tzdata OS, database, dan aplikasi Anda dalam sinkronisasi, baik satu sama lain, dan dengan seluruh dunia, dan menguji secara luas ketika Anda memutakhirkan. Bukan tidak pernah terdengar bahwa aplikasi pihak ketiga yang Anda andalkan tidak menangani perubahan TZ dengan benar.
Pastikan jam perangkat keras diatur ke UTC, dan jika Anda menjalankan server di seluruh dunia, pastikan OS mereka juga dikonfigurasi untuk menggunakan UTC. Ini menjadi jelas ketika Anda perlu menyalin file log apache yang diputar setiap jam dari server di beberapa zona waktu. Mengurutkannya berdasarkan nama file hanya berfungsi jika semua file diberi nama dengan zona waktu yang sama. Ini juga berarti bahwa Anda tidak harus melakukan matematika tanggal di kepala ketika Anda ssh dari satu kotak ke kotak lainnya dan perlu membandingkan cap waktu.
Juga, jalankan ntpd di semua kotak.
Klien
Jangan pernah percaya cap waktu yang Anda dapatkan dari mesin klien valid. Misalnya, Tanggal: tajuk HTTP, atau
Date.getTime()
panggilan javascript . Ini baik-baik saja ketika digunakan sebagai pengidentifikasi buram, atau ketika melakukan matematika tanggal selama satu sesi pada klien yang sama, tetapi jangan mencoba referensi silang nilai-nilai ini dengan sesuatu yang Anda miliki di server. Klien Anda tidak menjalankan NTP, dan mungkin tidak memiliki baterai yang berfungsi untuk jam BIOS mereka.Hal sepele
Akhirnya, pemerintah terkadang akan melakukan hal-hal yang sangat aneh:
Ok, saya pikir saya sudah selesai.
sumber
DateTimeOffset
(atau setara) sangat berguna. Kalau tidak, tulis yang baik.Ini adalah masalah yang sulit dan penting. Yang benar adalah bahwa tidak ada standar yang sepenuhnya memuaskan untuk waktu yang bertahan lama. Sebagai contoh, standar SQL dan format ISO (ISO 8601) jelas tidak cukup.
Dari sudut pandang konseptual, orang biasanya berurusan dengan dua jenis data tanggal-waktu, dan lebih mudah untuk membedakannya (standar di atas tidak): " waktu fisik " dan " waktu sipil ".
Instan waktu "fisik" adalah titik dalam garis waktu universal berkesinambungan yang dihadapi fisika (tentu saja, mengabaikan relativitas). Konsep ini dapat dikodekan secara memadai dalam UTC, misalnya (jika Anda dapat mengabaikan detik kabisat).
Waktu "sipil" adalah spesifikasi waktu pakai yang mengikuti norma sipil: titik waktu di sini ditentukan sepenuhnya oleh seperangkat bidang waktu pakai (Y, M, D, H, MM, S, FS) ditambah TZ (spesifikasi zona waktu) (juga "kalender", sebenarnya; tetapi mari kita asumsikan kita membatasi diskusi untuk kalender Gregorian). Zona waktu dan kalender secara bersama memungkinkan (pada prinsipnya) untuk memetakan dari satu representasi ke yang lain. Tetapi contoh waktu sipil dan fisik pada dasarnya berbeda jenis besarnya, dan mereka harus disimpan secara konseptual dipisahkan dan diperlakukan secara berbeda (analogi: array byte dan string karakter).
Masalahnya membingungkan karena kita berbicara tentang peristiwa semacam ini secara bergantian, dan karena masa sipil dapat berubah secara politik. Masalahnya (dan kebutuhan untuk membedakan konsep-konsep ini) menjadi lebih jelas untuk peristiwa di masa depan. Contoh (diambil dari diskusi saya di sini .
John mencatat dalam kalendernya pengingat untuk beberapa acara pada waktu tayang
2019-Jul-27, 10:30:00
, TZ =Chile/Santiago
, (yang telah mengimbangi GMT-4, maka itu sesuai dengan UTC2019-Jul-27 14:30:00
). Tetapi suatu hari di masa depan, negara memutuskan untuk mengubah TZ offset ke GMT-5.Sekarang, ketika hari itu tiba ... jika pengingat itu memicu
A)
2019-Jul-27 10:30:00 Chile/Santiago
=UTC time 2019-Jul-27 15:30:00
?atau
B)
2019-Jul-27 9:30:00 Chile/Santiago
=UTC time 2019-Jul-27 14:30:00
?Tidak ada jawaban yang benar, kecuali ada yang tahu apa yang dimaksud secara konseptual John ketika ia mengatakan pada kalender "Tolong telepon saya di
2019-Jul-27, 10:30:00 TZ=Chile/Santiago
".Apakah maksudnya "waktu kencan sipil" ("ketika jam di kota saya memberi tahu pukul 10:30")? Dalam hal itu, A) adalah jawaban yang benar.
Atau apakah yang dia maksudkan adalah "instan fisik waktu", sebuah titik dalam garis waktu alam semesta kita, katakan, "ketika gerhana matahari berikutnya terjadi". Dalam hal itu, jawaban B) adalah yang benar.
Beberapa Date / Time API mendapatkan pembedaan ini dengan benar: di antaranya, Jodatime , yang merupakan fondasi Java DateTime API (ketiga!) Berikutnya (ketiga!).
sumber
Buat pemisahan arsitektural yang jelas dari keprihatinan - untuk mengetahui dengan tepat tier mana yang berinteraksi dengan pengguna, dan harus mengubah tanggal-waktu untuk / dari representasi kanonik (UTC). Tanggal-waktu non-UTC adalah presentasi (mengikuti zona waktu pengguna), waktu UTC adalah model (tetap unik untuk back-end dan tingkatan menengah).
Juga, putuskan apa audiens Anda yang sebenarnya, apa yang tidak harus Anda layani dan di mana Anda menentukan batas . Jangan menyentuh kalender eksotis kecuali Anda benar-benar memiliki pelanggan penting di sana dan kemudian pertimbangkan server terpisah yang menghadap pengguna hanya untuk wilayah itu.
Jika Anda dapat memperoleh dan memelihara lokasi pengguna, gunakan lokasi untuk konversi tanggal-waktu yang sistematis (katakanlah .NET culture atau tabel SQL) tetapi berikan cara bagi pengguna akhir untuk memilih penggantian jika tanggal-waktu sangat penting bagi pengguna Anda.
Jika ada kewajiban audit historis yang terlibat (seperti memberi tahu kapan Jo di AZ membayar tagihan 2 tahun lalu pada bulan September) maka simpanlah waktu UTC dan waktu setempat untuk dicatat (tabel konversi Anda akan berubah dalam perjalanan waktu).
Tetapkan zona waktu referensial waktu untuk data yang datang dalam bentuk seperti file, layanan web, dll. Katakanlah East Coast company memiliki pusat data di CA - Anda perlu bertanya dan tahu apa yang mereka gunakan sebagai standar alih-alih dengan asumsi satu atau yang lain.
Jangan mempercayai offset zona waktu yang tertanam dalam representasi tekstual dari tanggal-waktu dan tidak menerima untuk mem-parsing dan mengikuti mereka. Alih-alih selalu meminta zona waktu dan / atau zona referensi harus didefinisikan secara eksplisit . Anda dapat dengan mudah menerima waktu dengan PST offset tetapi waktu sebenarnya EST karena itulah waktu referensi klien dan catatan baru saja diekspor di server yang ada di PST.
sumber
Anda perlu tahu tentang basis data Olson tz , yang tersedia di
ftp://elsie.nci.nih.gov/pubhttp://iana.org/time-zones/ . Diperbaharui beberapa kali per tahun untuk menghadapi perubahan yang sering menit terakhir ketika (dan apakah) beralih antara waktu musim dingin dan musim panas (penghematan standar dan siang hari) di berbagai negara di seluruh dunia. Pada tahun 2009, rilis terakhir adalah tahun 2009; pada 2010, itu 2010n; pada 2011, itu 2011n; pada akhir Mei 2012, rilisnya adalah 2012c. Perhatikan bahwa ada satu set kode untuk mengelola data dan data zona waktu aktual itu sendiri, dalam dua arsip terpisah (tzcode20xxy.tar.gz dan tzdata20xxy.tar.gz). Baik kode dan data berada dalam domain publik.Ini adalah sumber nama zona waktu seperti Amerika / Los_Angeles (dan sinonim seperti AS / Pasifik).
Jika Anda perlu melacak zona yang berbeda, maka Anda memerlukan database Olson. Seperti yang disarankan orang lain, Anda juga ingin menyimpan data dalam format tetap - UTC biasanya yang dipilih - bersama dengan catatan zona waktu di mana data dihasilkan. Anda mungkin ingin membedakan antara offset dari UTC pada waktu dan nama zona waktu; yang bisa membuat perbedaan nanti. Juga, mengetahui bahwa saat ini 2010-03-28T23: 47: 00-07: 00 (AS / Pasifik) mungkin atau mungkin tidak membantu Anda dengan menafsirkan nilai 2010-11-15T12: 30 - yang mungkin ditentukan dalam PST ( Waktu Standar Pasifik) daripada PDT (Waktu Hemat Siang Pasifik).
Antarmuka C library standar tidak terlalu membantu dengan hal-hal semacam ini.
Data Olson telah dipindahkan, sebagian karena AD Olson akan segera pensiun, dan sebagian karena ada (sekarang diberhentikan) gugatan hukum terhadap pengelola atas pelanggaran hak cipta. Database zona waktu sekarang dikelola di bawah naungan IANA , Otoritas Angka yang Ditugaskan Internet, dan ada tautan di halaman depan ke 'Database Zona Waktu' . Milis diskusi sekarang
[email protected]
; daftar pengumumannya adalah[email protected]
.sumber
zic.8
halaman manual (atauzic.8.txt
). Anda akan memerlukantzcode2011i.tar.gz
file daripada, atau juga,tzdata2011i.tar.gz
file untuk mendapatkan informasi ini.Secara umum, sertakan offset waktu lokal (termasuk offset DST) dalam stempel waktu tersimpan: UTC saja tidak cukup jika Anda nanti ingin menampilkan stempel waktu di zona waktu aslinya (dan pengaturan DST).
Perlu diingat bahwa offset tidak selalu merupakan jumlah jam bilangan bulat (mis. Waktu Standar India adalah UTC + 05: 30).
Misalnya, format yang sesuai adalah tuple (waktu unix, offset dalam hitungan menit) atau ISO 8601 .
sumber
Melintasi batas "waktu komputer" dan "waktu orang" adalah mimpi buruk. Yang utama adalah bahwa tidak ada semacam standar untuk aturan yang mengatur zona waktu dan waktu musim panas. Negara bebas mengubah zona waktu dan aturan DST kapan saja, dan mereka melakukannya.
Beberapa negara misalnya Israel, Brasil, memutuskan setiap tahun kapan memiliki waktu musim panas, sehingga tidak mungkin untuk mengetahui sebelumnya kapan (jika) DST akan berlaku. Yang lain telah memperbaiki (ish) aturan kapan DST berlaku. Negara-negara lain tidak menggunakan DST sama sekali.
Zona waktu tidak harus menjadi perbedaan jam penuh dari GMT. Nepal adalah +5,45. Bahkan ada zona waktu yang +13. Itu berarti:
semuanya bersamaan, namun 3 hari berbeda!
Juga tidak ada standar yang jelas tentang singkatan zona waktu, dan bagaimana mereka berubah ketika di DST sehingga Anda berakhir dengan hal-hal seperti ini:
Saran terbaik adalah menjauhi waktu setempat sebanyak mungkin dan tetaplah pada UTC di mana Anda bisa. Konversi hanya ke waktu lokal pada saat terakhir yang mungkin.
Saat pengujian pastikan Anda menguji negara di belahan bumi Barat dan Timur, dengan DST sedang berlangsung dan tidak dan negara yang tidak menggunakan DST (total 6).
sumber
Untuk PHP:
Kelas DateTimeZone di PHP> 5.2 sudah didasarkan pada Olson DB yang disebutkan orang lain, jadi jika Anda melakukan konversi zona waktu dalam PHP dan bukan dalam DB, Anda dibebaskan untuk bekerja dengan file Olson (yang sulit dipahami).
Namun, PHP tidak diperbarui sesering Olson DB, jadi hanya menggunakan konversi zona waktu PHP dapat membuat Anda dengan informasi DST yang ketinggalan zaman dan memengaruhi kebenaran data Anda. Meskipun hal ini tidak diharapkan sering terjadi, ini mungkin terjadi, dan akan terjadi jika Anda memiliki basis pengguna yang besar di seluruh dunia.
Untuk mengatasi masalah di atas, gunakan paket peczon timezonedb . Fungsinya untuk memperbarui data zona waktu PHP. Instal paket ini sesering diperbarui. (Saya tidak yakin apakah pembaruan pada paket ini mengikuti persis pembaruan Olson, tetapi tampaknya diperbarui pada frekuensi yang setidaknya sangat dekat dengan frekuensi pembaruan Olson.)
sumber
Jika desain Anda dapat menampungnya, hindari konversi waktu setempat secara bersamaan!
Saya tahu beberapa hal ini mungkin terdengar gila tetapi pikirkan tentang UX: proses pengguna dekat, tanggal relatif (hari ini, kemarin, Senin depan) lebih cepat daripada tanggal absolut (2010.09.17, Jumat 17 September) secara sekilas. Dan ketika Anda memikirkannya lebih lanjut, keakuratan zona waktu (dan DST) lebih penting semakin dekat tanggalnya
now()
, jadi jika Anda dapat mengekspresikan tanggal / waktu dalam format relatif untuk +/- 1 atau 2 minggu, sisa dari tanggal dapat UTC dan itu tidak masalah terlalu banyak untuk 95% pengguna.Dengan cara ini Anda dapat menyimpan semua tanggal dalam UTC dan melakukan perbandingan relatif dalam UTC dan hanya menunjukkan tanggal UTC pengguna di luar Ambang Batas Tanggal Relatif Anda.
Ini juga dapat berlaku untuk input pengguna (tetapi umumnya dengan cara yang lebih terbatas). Memilih dari drop-down yang hanya memiliki {Yesterday, Today, Tomorrow, Monday Next, Thursday Next} jauh lebih sederhana dan lebih mudah bagi pengguna daripada pemilih tanggal. Pemetik tanggal adalah beberapa komponen pengisian formulir yang paling menyakitkan. Tentu saja ini tidak akan bekerja untuk semua kasus tetapi Anda dapat melihat bahwa hanya dibutuhkan sedikit desain yang pintar untuk membuatnya sangat kuat.
sumber
Meskipun saya belum mencobanya, pendekatan penyesuaian zona waktu yang menurut saya menarik adalah sebagai berikut:
Simpan semuanya dalam UTC.
Buat tabel
TZOffsets
dengan tiga kolom: RegionClassId, StartDateTime, dan OffsetMinutes (int, dalam menit).Di tabel, simpan daftar tanggal dan waktu ketika waktu setempat berubah, dan seberapa banyak. Jumlah wilayah dalam tabel dan jumlah tanggal akan tergantung pada kisaran tanggal dan wilayah mana yang perlu Anda dukung. Pikirkan ini seolah-olah itu adalah tanggal "historis", meskipun tanggal harus mencakup masa depan hingga batas praktis.
Ketika Anda perlu menghitung waktu lokal setiap waktu UTC, lakukan saja ini:
Anda mungkin ingin men-cache tabel ini di aplikasi Anda dan menggunakan LINQ atau cara serupa untuk melakukan kueri daripada memukul database.
Data ini dapat disaring dari domain publik tz basis data .
Keuntungan dan catatan kaki dari pendekatan ini:
Sekarang, satu-satunya kelemahan dari pendekatan ini atau yang lain adalah bahwa konversi dari waktu setempat ke GMT tidak sempurna, karena perubahan DST yang memiliki offset negatif ke jam mengulangi waktu setempat yang diberikan. Tidak ada cara mudah untuk berurusan dengan yang itu, saya khawatir, yang merupakan salah satu alasan menyimpan waktu lokal adalah berita buruk di tempat pertama.
sumber
Saya baru-baru ini memiliki masalah dalam aplikasi web di mana pada post-back Ajax datetime kembali ke kode sisi server saya berbeda dari datetime dilayani.
Kemungkinan besar itu berkaitan dengan kode JavaScript saya pada klien yang membangun tanggal untuk memposting kembali ke klien sebagai string, karena JavaScript menyesuaikan zona waktu dan penghematan siang hari, dan di beberapa browser perhitungan untuk kapan menerapkan penghematan siang hari tampaknya berbeda dari yang lain.
Pada akhirnya saya memilih untuk menghapus perhitungan tanggal dan waktu pada klien sepenuhnya, dan diposting kembali ke server saya pada kunci integer yang kemudian diterjemahkan ke waktu tanggal di server, untuk memungkinkan transformasi yang konsisten.
Pembelajaran saya dari ini: Jangan gunakan perhitungan tanggal dan waktu JavaScript dalam aplikasi web kecuali Anda benar-benar harus melakukannya.
sumber
Saya telah mencapai ini pada dua jenis sistem, “sistem perencanaan shift (misalnya pekerja pabrik)” dan “sistem manajemen ketergantungan gas)…
23 dan 25 jam hari yang panjang adalah rasa sakit untuk mengatasinya, demikian juga shift 8 jam yang memakan waktu 7 jam atau 9 jam. Masalahnya adalah Anda akan menemukan bahwa setiap pelanggan, atau bahkan departemen pelanggan memiliki aturan berbeda yang mereka buat (seringkali tanpa mendokumentasikan) tentang apa yang mereka lakukan dalam kasus khusus ini.
Beberapa pertanyaan sebaiknya tidak ditanyakan kepada pelanggan sampai mereka membayar perangkat lunak "off the shelf" Anda. Sangat jarang menemukan pelanggan yang memikirkan masalah seperti ini di muka saat membeli perangkat lunak.
Saya pikir dalam semua kasus Anda harus mencatat waktu dalam UTC dan mengkonversi ke / dari waktu setempat sebelum menyimpan tanggal / waktu. Namun, bahkan tahu yang memerlukan waktu tertentu bisa sulit dengan Daylight saving dan zona waktu.
sumber
Untuk web, aturannya tidak rumit ...
Sisanya hanya konversi UTC / lokal menggunakan perpustakaan datetime sisi server Anda. Baik untuk pergi...
sumber
Ketika datang ke aplikasi yang berjalan di server , termasuk situs web dan layanan back-end lainnya, pengaturan zona waktu server harus diabaikan oleh aplikasi.
Saran umum adalah mengatur zona waktu server ke UTC. Ini memang praktik terbaik yang baik, tetapi ada sebagai bantuan band untuk aplikasi yang tidak mengikuti praktik terbaik lainnya. Misalnya, suatu layanan mungkin menulis untuk mencatat file dengan stempel waktu lokal alih-alih stempel waktu berbasis UTC, sehingga menciptakan ambiguitas selama transisi musim gugur dari waktu mundur. Pengaturan zona waktu server untuk UTC akan memperbaiki bahwa aplikasi. Namun perbaikan sebenarnya adalah aplikasi untuk login menggunakan UTC untuk memulai.
Kode sisi server, termasuk situs web, tidak boleh mengharapkan zona waktu lokal server menjadi sesuatu yang khusus.
Dalam beberapa bahasa, zona waktu lokal dapat dengan mudah masuk ke kode aplikasi. Misalnya,
DateTime.ToUniversalTime
metode dalam .NET akan dikonversi dari zona waktu lokal ke UTC, danDateTime.Now
properti mengembalikan waktu saat ini di zona waktu lokal. JugaDate
konstruktor dalam JavaScript menggunakan zona waktu lokal komputer. Ada banyak contoh lain seperti ini. Penting untuk berlatih pemrograman defensif, menghindari kode apa pun yang menggunakan pengaturan zona waktu lokal komputer.Cadangan menggunakan zona waktu lokal untuk kode sisi klien, seperti aplikasi desktop, aplikasi seluler, dan JavaScript sisi klien.
sumber
Tetap atur server Anda ke UTC, dan pastikan semuanya dikonfigurasi untuk ntp atau yang setara.
UTC menghindari masalah penghematan waktu siang hari, dan server yang tidak sinkron dapat menyebabkan hasil yang tidak terduga yang memerlukan waktu untuk didiagnosis.
sumber
Hati-hati ketika berhadapan dengan stempel waktu yang disimpan dalam sistem file FAT32 - ini selalu bertahan dalam koordinat waktu lokal (yang mencakup DST - lihat artikel msdn ). Terbakar yang itu.
sumber
Satu hal lagi, pastikan server menerapkan patch tabungan siang hari yang terkini.
Kami memiliki situasi tahun lalu di mana waktu kami secara konsisten habis satu jam untuk periode tiga minggu untuk pengguna di Amerika Utara, meskipun kami menggunakan sistem berbasis UTC.
Ternyata pada akhirnya itu adalah server. Mereka hanya membutuhkan patch terbaru yang diterapkan ( Windows Server 2003 ).
sumber
DateTimeZone::listAbbreviations()
Output PHPMetode PHP ini mengembalikan array asosiatif yang mengandung beberapa zona waktu 'utama' (seperti CEST), yang dengan sendirinya mengandung zona waktu 'geografis' yang lebih spesifik (seperti Eropa / Amsterdam).
Jika Anda menggunakan zona waktu ini dan informasi offset / DST mereka, sangat penting untuk menyadari hal-hal berikut:
Sepertinya semua konfigurasi offset / DST yang berbeda (termasuk konfigurasi historis) dari masing-masing zona waktu disertakan!
Misalnya, Eropa / Amsterdam dapat ditemukan enam kali dalam output fungsi ini. Dua kejadian (offset 1172/4772) adalah untuk waktu Amsterdam digunakan sampai 1937; dua (1200/4800) untuk waktu yang digunakan antara 1937 dan 1940; dan dua (3600/4800) untuk waktu yang digunakan sejak 1940.
Oleh karena itu, Anda tidak dapat mengandalkan informasi offset / DST yang dikembalikan oleh fungsi ini karena saat ini benar / sedang digunakan!
Jika Anda ingin mengetahui offset / DST saat ini dari zona waktu tertentu, Anda harus melakukan sesuatu seperti ini:
sumber
Jika Anda kebetulan memelihara sistem basis data yang berjalan dengan DST aktif, periksa dengan cermat apakah mereka perlu dimatikan selama transisi di musim gugur. Mandy DBS (atau sistem lain juga) tidak suka melewati titik yang sama dalam waktu (lokal) dua kali, yang persis apa yang terjadi ketika Anda memutar kembali jam di musim gugur. SAP telah memecahkan ini dengan solusi (IMHO benar-benar rapi) - alih-alih memutar kembali jam, mereka hanya membiarkan jam internal berjalan pada setengah kecepatan biasa selama dua jam ...
sumber
Apakah Anda menggunakan .NET framework ? Jika demikian, izinkan saya memperkenalkan Anda dengan tipe DateTimeOffset , ditambahkan dengan .NET 3.5.
Struktur ini menampung a
DateTime
dan Offset (TimeSpan
), yang menentukan perbedaan antaraDateTimeOffset
tanggal dan waktu instance dan Waktu Universal Terkoordinasi (UTC).The
DateTimeOffset.Now
metode statis akan mengembalikanDateTimeOffset
instance yang terdiri dari arus waktu (lokal), dan lokal offset (sebagaimana didefinisikan dalam Info daerah sistem operasi).The
DateTimeOffset.UtcNow
metode statis akan mengembalikanDateTimeOffset
instance yang terdiri dari waktu saat ini dalam UTC (seolah-olah Anda berada di Greenwich).Jenis bermanfaat lainnya adalah kelas TimeZone dan TimeZoneInfo .
sumber
Bagi mereka yang berjuang dengan ini di . NET , lihat apakah menggunakan
DateTimeOffset
dan / atauTimeZoneInfo
bernilai saat Anda.Jika Anda ingin menggunakan zona waktu IANA / Olson , atau menemukan tipe bawaan tidak cukup untuk kebutuhan Anda, periksa Noda Time , yang menawarkan API tanggal dan waktu yang jauh lebih cerdas untuk .NET.
sumber
Aturan bisnis harus selalu bekerja pada waktu sipil (kecuali ada undang-undang yang mengatakan sebaliknya). Sadarilah bahwa waktu sipil berantakan, tetapi itulah yang digunakan orang-orang sehingga itu yang penting.
Secara internal, simpan cap waktu dalam sesuatu seperti waktu-sipil-detik-dari-zaman. The zaman tidak peduli terutama (saya mendukung zaman Unix ) tetapi melakukan hal-hal make lebih mudah daripada alternatif. Berpura-puralah bahwa detik kabisat tidak ada kecuali Anda melakukan sesuatu yang benar - benar membutuhkannya (misalnya, pelacakan satelit). Pemetaan antara cap waktu dan waktu yang ditampilkan adalah satu-satunya titik di mana aturan DST harus diterapkan; peraturan sering berubah (di tingkat global, beberapa kali setahun; menyalahkan politisi) sehingga Anda harus memastikan bahwa Anda tidak melakukan hard-code pemetaan. Basis data TZ Olson sangat berharga.
sumber
Hanya ingin menunjukkan dua hal yang tampaknya tidak akurat atau setidaknya membingungkan:
Untuk (hampir) semua tujuan komputasi praktis, UTC sebenarnya adalah GMT. Kecuali jika Anda melihat cap waktu dengan pecahan detik, Anda berurusan dengan GMT yang membuat perbedaan ini berlebihan.
Stempel waktu selalu diwakili dalam GMT dan karenanya tidak memiliki offset.
sumber
Inilah pengalaman saya: -
(Tidak memerlukan perpustakaan pihak ketiga)
sumber
getTimezoneOffset
mengembalikan offset untuk tanggal dan waktu Anda menyebutnya. Offset itu dapat berubah ketika zona waktu transisi masuk atau keluar dari waktu musim panas. Lihat "zona waktu! = Offset" di wiki tag zona waktu .Video Tom Scott tentang zona waktu di YouTube pada saluran Computerphile juga memiliki deskripsi topik yang bagus dan menghibur. Contohnya termasuk:
sumber
Sebenarnya, kernel32.dll tidak mengekspor SystemTimeToTzSpecificLocation. Namun mengekspor dua berikut: SystemTimeToTzSpecificLocalTime dan TzSpecificLocalTimeToSystemTime ...
sumber
Jangan hanya mengandalkan konstruktor seperti
Mereka dapat melempar pengecualian ketika waktu tanggal tertentu tidak ada karena DST. Alih-alih, bangun metode Anda sendiri untuk membuat tanggal seperti itu. Di dalamnya, tangkap setiap pengecualian yang terjadi karena DST, dan sesuaikan waktu yang diperlukan dengan peralihan transisi. DST dapat terjadi pada tanggal dan waktu yang berbeda (bahkan di tengah malam untuk Brasil) menurut zona waktu.
sumber
Hanya satu contoh untuk membuktikan bahwa waktu penanganan adalah kekacauan besar yang dijelaskan, dan Anda tidak akan pernah bisa berpuas diri. Di beberapa tempat di halaman ini, lompatan detik telah diabaikan.
Beberapa tahun yang lalu, sistem operasi Android menggunakan satelit GPS untuk mendapatkan referensi waktu UTC, tetapi mengabaikan fakta bahwa satelit GPS tidak menggunakan leap-detik. Tidak ada yang memperhatikan sampai ada kebingungan di Malam Tahun Baru, ketika pengguna ponsel Apple dan pengguna ponsel Android melakukan hitung mundur sekitar 15 detik.
Saya pikir itu sudah diperbaiki, tetapi Anda tidak pernah tahu kapan 'detail kecil' ini akan kembali menghantui Anda.
sumber
struct tm
dalam C.¹¹ Beberapa implementasi
struct tm
do store of offset UTC, tetapi ini belum membuatnya menjadi standar.sumber
Dalam berurusan dengan basis data (khususnya MySQL , tetapi ini berlaku untuk sebagian besar basis data), saya merasa kesulitan untuk menyimpan UTC.
Saya merasa lebih mudah untuk hanya menyimpan datetime server dalam database, lalu biarkan database mengkonversi datetime yang disimpan kembali ke UTC (yaitu, UNIX_TIMESTAMP ()) dalam pernyataan SQL. Setelah itu Anda dapat menggunakan datetime sebagai UTC dalam kode Anda.
Jika Anda memiliki kontrol 100% atas server dan semua kode, mungkin lebih baik mengubah zona waktu server ke UTC.
sumber