Convertir DateTime au format Utc seulement si ce n'est déjà Utc
Je suis en utilisant le DateTimeWithZone struct que Jon Skeet posté à La création d'un DateTime dans un fuseau Horaire spécifique en c# fx 3.5
Cela ne fonctionne pas exactement pour ma situation, car il suppose que la date-heure passée dans le constructeur est le heure locale, et, par conséquent, le convertit à l'Utc en utilisant le Fuseau horaire spécifié.
Dans mon cas, on va surtout être de passage dans DateTime objets déjà en Utc (puisque c'est ce que nous emmagasinons) nous avons donc besoin de faire la conversion, si la source de données DateTime.Le genre n'est pas l'heure Utc.
Donc j'ai changé le constructeur:
public DateTimeWithZone(DateTime dateTime, TimeZoneInfo timeZone, DateTimeKind kind = DateTimeKind.Utc) {
dateTime = DateTime.SpecifyKind(dateTime, kind);
utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTime, timeZone);
this.timeZone = timeZone;
}
Ici, nous avons une option de Type de paramètre que les valeurs par défaut à l'Utc.
Toutefois, l'exécution de ce code, et en passant une Utc DateTime génère l'exception suivante:
La conversion n'a pu être effectué car le DateTime ne pas avoir le Genre bien défini correctement. Par exemple, lorsque le Type de la propriété est DateTimeKind.Local, la source de fuseau horaire doit être TimeZoneInfo.Locaux.
Selon les docs (http://msdn.microsoft.com/en-us/library/bb495915.aspx):
Si le Type de propriété de type dateTime paramètre est égal à DateTimeKind.L'Utc et le sourceTimeZone paramètre est égal à TimeZoneInfo.Utc, cette méthode retourne dateTime sans effectuer de conversion.
Depuis deux le temps d'entrée et le fuseau horaire, les deux ont une Sorte de propriété de l'Utc, puis je voudrais vous attendez pas à obtenir cette exception.
Ai-je mal compris?
Non, c'est Windows 7
OriginalL'auteur Ben Foster | 2011-05-27
Vous devez vous connecter pour publier un commentaire.
Comme la MSDN docs disent que si vous passez dans un
DateTime
avec le type à définir à quoi que ce soit d'ailleursDateTimeKind.Utc
et spécifier unTimeZone
autres que l'heure Utc de la fonction de conversion lèvera une exception. Que Doit être ce qui se passe ici. Dans votre code, vous devez vérifier si la date est déjà en Utc et passez la conversion, si elle est.Aussi depuis le dateTime vous êtes de passage en aura un DateTime attaché à elle déjà vous n'avez probablement pas besoin de passer dans un autre Type de paramètre.
de la docs
sens qu'il convertit le fuseau horaire fourni à l'Utc
la fonction lève une exception d'argument si:
TimeZoneInfo.Local
) ont une Sorte de DateTimeKind.Utc, donc il ne devrait pas produire une exception.Oui il faut.
ConvertTimeToUtc
convertit de le fuseau horaire spécifié à l'utc. si le fuseau horaire le fuseau horaire local puis DateTime vous êtes de passage doit être deDateTimeKind.Local
pouvez-vous m'indiquer ce dans les docs?
J'ai mis à jour la réponse à inclure les parties pertinentes de la MSDN docs.
Je ne sais pas pourquoi il a fallu si longtemps pour rentrer 🙂 N'avait pas réalisé que l'Utc et Locales ont des propriétés statiques sur TimeZoneInfo. Comme vous le dites, beaucoup plus facile à vérifier le type de la source du temps et de sauter la conversion plutôt que de vérifier le fuseau horaire selon les règles ci-dessus.
OriginalL'auteur Yaur