2010-05-25 10 views
3

Je travaille sur un blog et je veux montrer mes messages dans le fuseau horaire de l'Est. Je pensais que stocker tout UTC serait la bonne façon. Cela crée cependant quelques défis:Stocker datetime dans la base de données?

  1. Je dois convertir toutes les heures de l'UTC à l'Est. Ce n'est pas un gros problème mais ajoute beaucoup de code.

  2. Et le "biggie" est que j'utilise un temps de courte date pour référencer les messages en passant une requête, ala blogger. Le problème est qu'il n'y a aucun moyen de convertir l'heure de date courte à la date UTC correcte parce que je manque l'information de temps affichée.

Hmm, avez-vous des problèmes pour stocker toutes les dates dans l'heure de l'Est? Cela faciliterait certainement le reste de l'application, mais si j'avais besoin de changer de fuseau horaire, tout serait mal stocké.

Mise à jour

@ Jon, beaucoup de valeur votre expertise, mais je l'ai décidé stocker l'heure UTC dans la base de données est erroné. Vous pourriez être en mesure de me convaincre du contraire si! Alors, laissez-moi vous en donner plein la peau. J'ai converti tous les temps en UTC, ce qui nécessitait d'ajouter beaucoup plus de "syntaxe" dans les parties déclaratives du code. Ce que je suis en train de coder est un blog, donc j'ai 2 routes, une route de liste et une route de détails. La route des détails prend une date courte et le nom du poste qui suppose que le combiné est unique. C'est pourquoi ça tombe en panne. Je passe le chemin court dans la requête. Selon l'heure de la journée, nous pouvons envelopper 29 et 30. Donc, la date courte doit être correcte car je n'ai pas assez d'informations dans la requête pour déterminer comment convertir l'heure de l'Est en UTC. Je stockais une "date courte" DatePosted avec tous les temps @ 12 heures à des fins SQL et une date longue FirstModified pour l'heure. Donc, j'ai dit, okay pas de problème, je vais juste stocker la date courte dans l'Est et ensuite convertir longue date à l'Est. Non, car je ne peux pas faire fonctionner ces requêtes. Donc, j'ai décidé que je m'y suis pris à tort et à travers. La date doit toujours être stockée dans l'heure de l'Est (le temps que je veux utiliser). Et puis, si l'utilisateur veut changer de fuseau horaire (pas une exigence), nous passons en revue toutes les entrées et les modifions. Peut-être, je pense à ce problème, mais dans mon cas, il n'y aura jamais que le fuseau horaire de l'Est utilisé, donc c'est une perte de temps de toute façon.

Réjouissez-vous de toute entrée sur ce!

Les principaux problèmes:

  1. Je passe à une date courte dans la requête. Si cette courte date est en UTC alors la date dans la requête pourrait être désactivée de 1. Si je passe la date courte à l'est alors j'ai besoin d'une syntaxe linq-to-sql qui peut être convertie en SQL qui me permettra de comparer la date fois de différents fuseaux horaires.

Merci encore pour toute aide!

Répondre

2

Il est juste un blog et non une application Web d'entreprise utilisé par les bureaux à travers le monde, alors je dis aller de l'avant et l'utilisation heure de l'Est.

Si vous avez déjà modifié des fuseaux horaires et que vous vouliez afficher le nouveau fuseau horaire, une instruction de mise à jour SQL peut mettre à jour toutes les heures dans la nouvelle zone.

5

Les temps de conversion de l'UTC à l'heure de l'Est ne doivent pas ajouter "beaucoup de code". Ça devrait être plutôt un one-liner.

Je ne suis pas sûr de ce que vous voulez vraiment dire par votre deuxième point - il serait utile si vous développiez là-dessus. Si vous ne connaissez pas le fuseau horaire impliqué, comment pouvez-vous même comprendre la requête? Si vous êtes effectivement en supposant que il est en heure de l'Est, alors vous pouvez faire la conversion appropriée en UTC.

L'utilisation d'une heure locale est généralement une mauvaise idée. Si vous avez seulement un fuseau horaire impliqué, alors ce n'est pas trop mauvais, mais si vous voulez utiliser d'autres fuseaux horaires, cela deviendra horrible. (Il ne s'agira pas seulement de mettre à jour en masse la base de données - il s'agira d'examiner chaque utilisation des dates dans toute l'application.)

Optez pour l'option UTC, IMO.

+0

@Jon Je pensais au cas où j'utilise une date courte. 23/05/2010. Cela pourrait être 23 ou 24 et ne peut pas être converti - selon le temps. Par exemple, la date peut être fausse. Je peux gérer cela à la source peut-être. –

+0

@Curtis White: Soit il y a une ambiguïté - dans ce cas, vous devez le gérer de toute façon - ou il n'y en a pas, et vous pouvez compenser le fuseau horaire dans le code. –

+0

@Jon Merci pour toute aide. J'ai mis à jour la question avec plus de détails.Le problème avec la conversion de toutes les date/heure partout est finalement que je finis par avoir besoin de support SQL pour ces problèmes, ce qui n'est pas évident comment réaliser certains d'entre eux dans SQL 2005. Donc ça devient un gâchis. Je décide qu'il est préférable de stocker cela dans les métadonnées, puis de convertir toutes les fois si l'on veut changer, ce qui évite aussi la plupart des conversions –

0

Stockez les heures en UTC et convertissez-les dans votre vue/page/quel que soit à l'heure locale ou, mieux encore, à l'heure locale du client. En outre, comme d'autres l'ont dit, convertir UTC en heure de l'Est ne devrait pas exiger beaucoup de code, car vous soustrayez fondamentalement quelques heures de l'heure tout en restant légèrement conscient de l'heure d'été.

Par exemple, considérons

DateTime currentServerTime = DateTime.UtcNow.ToLocalTime(); 
+0

Cela ne fonctionnera pas. Je ne veux pas l'heure locale sur le serveur mais l'heure de l'Est. Merci quand même. –

0

Stockez les valeurs dans la base de données au format UTC, puis convertissez en heure locale sur le client. De cette façon, chaque client voit des temps dans son cadre de référence local et vous n'avez pas besoin de vous préoccuper de fuseaux horaires spécifiques.

Questions connexes