web-dev-qa-db-fra.com

Obtenir le fuseau horaire de DateTime

Le .Net DateTime contient-il des informations sur le fuseau horaire où il a été créé? 

J'ai une bibliothèque analysant DateTime à partir d'un format comportant "+ zz" à la fin. Bien qu'elle analyse correctement et ajuste l'heure locale, je dois connaître le fuseau horaire spécifique de l'objet DateTime. 

Est-ce possible? Tout ce que je peux voir, c'est DateTime.Kind, qui spécifie si l'heure est locale ou UTC.

88
dbkk

DateTime lui-même ne contient aucune information de fuseau horaire réelle. Il peut savoir si c'est UTC ou local, mais pas ce que signifie réellement local.

DateTimeOffset est un peu mieux - c'est essentiellement une heure UTC et un décalage. Cependant, cela ne suffit pas encore pour déterminer le fuseau horaire, car plusieurs fuseaux horaires différents peuvent avoir le même décalage à tout moment. Cela semble être suffisant pour vous, car tout ce que vous avez à faire lorsque vous analysez la date/heure est le décalage. 

La prise en charge des fuseaux horaires à partir de .NET 3.5 est bien meilleure qu’elle ne l’était, mais j'aimerais vraiment voir un "ZonedDateTime" standard ou quelque chose du genre - une heure UTC et un fuseau horaire réel. Il est facile de construire le vôtre, mais il serait agréable de le voir dans les bibliothèques standard.

EDIT: Près de quatre ans plus tard, je suggérerais maintenant d’utiliser Noda Time qui contient un ensemble de types de date/heure plutôt plus riche. Je suis cependant biaisé, en tant qu'auteur principal de Noda Time :)

125
Jon Skeet

Non.

Un développeur est chargé de garder trace des informations de fuseau horaire associées à une valeur DateTime via un mécanisme externe.

Une citation d'un excellent article ici . A lire absolument pour tous les développeurs .Net.

Mon conseil est donc d’écrire un petit cours d’emballage qui répond à vos besoins.

33
Gerrie Schenck

Il existe une bibliothèque TimeZone public domain pour .NET . Vraiment utile. Cela répondra à vos besoins.

La résolution du problème de fuseau horaire est plus difficile que vous ne le pensez. 

5
Cheeso

Vous pouvez utiliser TimeZoneInfo class

La classe TimeZone reconnaît le fuseau horaire local et peut convertir les heures entre le temps universel coordonné (UTC) et l'heure locale. Un objet TimeZoneInfo peut représenter n’importe quel fuseau horaire et les méthodes de la classe TimeZoneInfo peuvent être utilisées pour convertir l’heure d’un fuseau horaire en heure correspondante dans un autre fuseau horaire. Les membres de la classe TimeZoneInfo prennent en charge les opérations suivantes:

  1. Récupération d'un fuseau horaire déjà défini par le système d'exploitation

  2. Énumération des fuseaux horaires disponibles sur un système.

  3. Conversion des heures entre différents fuseaux horaires.

  4. Création d'un nouveau fuseau horaire qui n'est pas déjà défini par le système d'exploitation

    Sérialisation d'un fuseau horaire pour une récupération ultérieure.

2
Shekhar

Depuis l'API ( http://msdn.Microsoft.com/en-us/library/system.datetime_members(VS.71).aspx ), il ne semble pas qu'il puisse afficher le nom du fuseau horaire utilisé.

1
tehvan

En règle générale, la pratique consiste à transmettre des données au format DateTime avec un "fuseau horaire" UTC, puis un objet TimeZoneInfo. Lorsque vous êtes prêt à afficher les données, vous utilisez l'objet TimeZoneInfo pour convertir le DateTime UTC.

L'autre option consiste à définir la date et l'heure avec le fuseau horaire actuel, puis à vous assurer que le "fuseau horaire" est inconnu pour l'objet DateTime, puis assurez-vous que la date et l'heure sont à nouveau passées avec un TimeZoneInfo qui indique le fuseau horaire de la date.

Comme d'autres l'ont indiqué ici, ce serait bien si Microsoft maîtrisait tout cela et créait un seul objet Nice pour tout faire, mais pour l'instant, vous devez gérer deux objets.

0
Rob