Apa praktik terbaik untuk menghemat Zona Waktu di dalam basis data?

12

Kami ingin mulai mengumpulkan zona waktu untuk setiap alamat kami di basis data. Apa praktik terbaik untuk menyimpan zona waktu? Bagaimana cara Anda mendapatkan zona waktu untuk catatan alamat yang ada?

Saya menggunakan server Microsoft SQL, .net mvc, C #. Setiap saran akan sangat dihargai.

Rodney
sumber
Btw zona waktu normal gotcha adalah menggunakan int, tetapi beberapa zona waktu bisa + atau - 30 menit, atau bahkan 15 menit :) Oh dan ingat itu bukan ilmu pasti, penghematan siang hari dan semacamnya bisa membuat Anda pergi.
Rocklan
2
@LachlanB satu cara untuk mengatakannya adalah bahwa zona waktu lebih merupakan lokasi daripada offset waktu . Tetapi bahkan pandangan itu tidak cukup sendiri, misalnya Rusia baru-baru ini mengubah kebijakan mereka mengenai penghematan siang hari, artinya Anda harus memperlakukannya secara berbeda tergantung pada tanggal yang sebenarnya.
Daniel B

Jawaban:

7

Anda ingin menyimpan sesuatu yang tidak berubah sepanjang waktu (atau dua kali setahun). Basis data zona waktu https://en.wikipedia.org/wiki/List_of_tz_database_time_zones adalah hal yang tepat. Jadi, Anda hanya menyimpan dua surat.

Dari basis data ini Anda dapat menanyakan waktu offset, dan kapan waktu musim panas aktif. Bukan hanya offset waktu, tetapi juga memberi Anda area, begitu banyak tempat pada garis lintang yang sama akan memiliki kode yang berbeda dan dapat mengubah aturan zona waktu mereka secara individual, dan perangkat lunak Anda akan dapat menanganinya.

Satu-satunya waktu ketika Anda perlu membuat perubahan dalam database Anda adalah ketika lokasi mengubah zona waktu miliknya, yang akan sangat jarang.

gnasher729
sumber
Perhatikan bahwa daftar di wikipedia tidak mengandung singkatan 2 karakter untuk semua zona waktu IANA - ditambah pemetaannya tidak ambigu. Jika Anda membutuhkan informasi historis lengkap, pilih nama lengkapnya.
Hulk
2
Hanya dua kode huruf yang saya lihat di halaman Wikipedia adalah kode negara. Ini tidak secara unik menentukan zona waktu. Misalnya, semua zona waktu di AS memiliki kode negara dua huruf yang sama: AS. Demikian pula, di seluruh Australia memiliki kode negara AU.
Ian
3

Praktik terbaik mutlak adalah menggunakan database yang mendukung TIMESTAMP WITH TIMEZONEtipe data yang didefinisikan oleh SQL99.

SQL Server memiliki tipe yang disebut datetimeoffsetyang TIMESTAMP WITH TIMEZONEdapat melakukan segalanya kecuali menyimpan zona waktu yang sebenarnya. Yang dapat Anda lakukan adalah menyimpan offset dari UTC (misalnya, 2013-05-04 12:34:56 -5:00), yang berarti Anda harus menentukannya sebelum penyimpanan berdasarkan zona waktu.

Blrfl
sumber
3

Dengan asumsi bahwa Anda menggunakan .Net framework 4.0 atau lebih tinggi, TimeZoneInfo adalah yang Anda butuhkan.

Simpan semua nilai tanggal dalam database dalam format UTC. Gunakan nilai ID atau hasil ToSerializedString () untuk setiap klien untuk membuat objek TimeZoneInfo untuk mengonversi tanggal yang disimpan ke format lokal untuk tampilan.

Dr luar negeri
sumber
2

Anda mengatakan ingin menyimpan zona waktu untuk setiap alamat di DB, tetapi Anda belum mengatakan apa yang ingin Anda lakukan dengannya. Menyimpan sesuatu dalam DB jarang merupakan tujuan itu sendiri.

Dalam kasus apa pun saya akan mencari untuk menggunakan database TZ , alias database Olsen, baik secara langsung atau dengan menggunakan beberapa perangkat lunak rak yang mengintegrasikan TZ. Anda dapat menyimpan zona waktu hanya sebagai string untuk merujuk ke salah satu entri TZ DB , misalnya 'Afrika / Kampala' atau 'Eropa / Paris'.

bdsl
sumber