Quelle est la meilleure pratique pour enregistrer les fuseaux horaires dans la base de données?

12

Nous voulons commencer à collecter des fuseaux horaires pour chacune de nos adresses dans la base de données. Quelle est la meilleure pratique pour stocker les fuseaux horaires? Comment feriez-vous pour acquérir des fuseaux horaires pour les enregistrements d'adresse existants?

J'utilise Microsoft SQL Server, .net mvc, C #. Toutes les suggestions seraient grandement appréciées.

Rodney
la source
Btw un fuseau horaire normal est d'utiliser un int, mais certains fuseaux horaires peuvent être + ou - 30 minutes, voire 15 minutes :) Oh et rappelez-vous que ce n'est pas une science exacte, l'heure d'été et cela peut vous déconcerter.
Rocklan
2
@LachlanB une façon de le dire est que le fuseau horaire est plus un emplacement qu'un décalage horaire . Mais même ce point de vue ne suffit pas à lui seul, par exemple, la Russie a récemment modifié sa politique concernant l'heure d'été, ce qui signifie que vous devrez la traiter différemment en fonction de la date réelle.
Daniel B

Réponses:

7

Vous souhaitez stocker quelque chose qui ne change pas tout le temps (ou deux fois par an). La base de données de fuseaux horaires https://en.wikipedia.org/wiki/List_of_tz_database_time_zones est exactement la bonne chose. Il vous suffit donc de stocker deux lettres.

À partir de cette base de données, vous pouvez demander le décalage horaire et le moment où l'heure d'été est active. Ce n'est pas seulement le décalage horaire, il vous donne également une zone, de nombreux endroits à la même latitude auront des codes différents et peuvent modifier individuellement leurs règles de fuseau horaire, et votre logiciel sera en mesure de les gérer.

Le seul moment où vous devez apporter des modifications à votre base de données est lorsqu'un emplacement change à quel fuseau horaire il appartient, ce qui serait très rare.

gnasher729
la source
Notez que la liste sur wikipedia ne contient pas d'abréviations à 2 caractères pour tous les fuseaux horaires de l'IANA - de plus la cartographie n'est pas univoque. Si vous avez besoin d'informations historiques complètes, optez plutôt pour les noms complets.
Hulk
2
Les seuls codes à deux lettres que je vois sur la page Wikipedia sont des codes de pays. Ceux-ci ne définissent pas uniquement les fuseaux horaires. Par exemple, tous les fuseaux horaires aux États-Unis ont le même code de pays à deux lettres: US. De même, dans toute l'Australie, le code du pays est AU.
Ian
3

La meilleure pratique absolue serait d'utiliser une base de données qui prend en charge le TIMESTAMP WITH TIMEZONEtype de données défini par SQL99.

SQL Server a un type appelé datetimeoffsetqui fait tout ce qu'il TIMESTAMP WITH TIMEZONEpeut faire sauf stocker le fuseau horaire réel. Tout ce que vous pouvez faire est de stocker un décalage par rapport à l'UTC (par exemple, 2013-05-04 12:34:56 -5:00), ce qui signifie que vous devrez le déterminer avant le stockage en fonction du fuseau horaire.

Blrfl
la source
3

En supposant que vous utilisez .Net Framework 4.0 ou supérieur, TimeZoneInfo est ce dont vous avez besoin.

Stockez toutes les valeurs de date dans la base de données au format UTC. Utilisez la valeur d'ID ou le résultat de ToSerializedString () pour chaque client pour créer un objet TimeZoneInfo pour convertir les dates stockées au format local pour l'affichage.

Peregrine
la source
2

Vous avez dit que vous souhaitez stocker un fuseau horaire pour chaque adresse dans votre base de données, mais vous n'avez pas dit ce que vous voulez en faire. Stocker quelque chose dans une base de données est rarement une fin en soi.

Dans tous les cas, je chercherais à utiliser la base de données TZ , alias la base de données Olsen, soit directement, soit en utilisant un logiciel standard qui intègre TZ. Vous pouvez stocker un fuseau horaire simplement sous la forme d'une chaîne pour faire référence à l'une des entrées TZ DB , par exemple 'Africa / Kampala' ou 'Europe / Paris'.

bdsl
la source