Sayangnya, tidak ada perbaikan cepat untuk ini. Internasionalisasi suatu aplikasi harus menjadi bagian dari diskusi desain pertama, karena hal itu benar-benar menjadi inti dari banyak bidang yang berbeda, termasuk perbandingan tanggal / waktu dan format keluaran.
Ngomong-ngomong, untuk melacak Doing It Right, penting untuk menyimpan informasi zona waktu bersama waktu . Dengan kata lain, menyadari bahwa tanggal / waktu tidak20130407 14:50
ada artinya tanpa (a) termasuk offset UTC saat itu zona waktu (catatan 1) , atau (b) memastikan bahwa semua logika yang memasukkan nilai-nilai ini pertama kali dikonversi ke offset tetap tertentu ( kemungkinan besar 0). Tanpa salah satu dari hal-hal itu, dua nilai waktu yang diberikan tidak dapat dibandingkan, dan datanya rusak . (Metode terakhir bermain dengan api (catatan 2) , omong-omong; jangan lakukan itu.)
Di SQL Server 2008+, Anda dapat menyimpan offset dengan waktu secara langsung dengan menggunakan datetimeoffset
tipe data. (Untuk kelengkapan, pada 2005 dan sebelumnya, saya akan menambahkan kolom kedua untuk menyimpan nilai offset UTC saat itu (dalam menit).)
Ini memudahkan aplikasi jenis desktop, karena platform ini biasanya memiliki mekanisme untuk secara otomatis mengkonversi tanggal / waktu + zona waktu ke waktu lokal dan kemudian memformat untuk output, semua berdasarkan pada pengaturan regional pengguna.
Untuk web, yang merupakan arsitektur yang terputus secara inheren, bahkan dengan data back-end yang diatur dengan benar, itu lebih kompleks karena Anda memerlukan informasi tentang klien untuk dapat melakukan konversi dan / atau pemformatan. Ini biasanya dilakukan melalui pengaturan preferensi pengguna (aplikasi mengkonversi / memformat hal-hal sebelum output), atau hanya menampilkan hal-hal dengan format tetap yang sama dan offset zona waktu untuk semua orang (yang dilakukan oleh platform Stack Exchange saat ini).
Anda dapat melihat bagaimana jika data back-end tidak diatur dengan benar, sangat cepat itu akan menjadi rumit dan meretas. Saya tidak akan merekomendasikan salah satu dari jalan-jalan tersebut karena Anda hanya akan berakhir dengan lebih banyak masalah di telepon.
Catatan 1:
Offset UTC zona waktu tidak tetap: pertimbangkan penghematan siang hari di mana offset UTC zona bervariasi dengan plus atau minus satu jam. Juga tanggal penghematan siang hari zona bervariasi secara teratur. Jadi menggunakan datetimeoffset
(atau gabungan dari local time
dan UTC offset at that time
) menghasilkan pemulihan informasi maksimum.
Catatan 2:
Ini tentang mengendalikan input data. Meskipun tidak ada cara yang mudah untuk memvalidasi nilai yang masuk, lebih baik untuk menegakkan standar sederhana yang tidak melibatkan perhitungan. Jika API publik mengharapkan tipe data yang menyertakan offset, persyaratan itu akan jelas bagi pemanggil.
Jika bukan itu masalahnya, penelepon harus bergantung pada dokumentasi (jika mereka membacanya), atau perhitungannya dilakukan secara tidak benar, dll. Ada lebih sedikit mode kegagalan / bug saat memerlukan offset, khususnya untuk sistem terdistribusi ( atau bahkan hanya web / database pada server terpisah seperti yang terjadi di sini).
Menyimpan offset tetap membunuh dua burung dengan satu batu; dan bahkan jika itu tidak diperlukan sekarang , itu membuat kemungkinan tersedia nanti jika perlu. Benar itu membutuhkan lebih banyak penyimpanan, tapi saya pikir itu layak trade-off karena data hilang jika tidak pernah direkam sejak awal.