2009-02-23 10 views
79

Le .Net DateTime contient-il des informations sur le fuseau horaire dans lequel il a été créé? J'ai une bibliothèque analysant DateTime à partir d'un format qui a "+ zz" à la fin, et tandis qu'il analyse correctement et ajuste une heure locale, j'ai besoin de savoir ce que le fuseau horaire spécifique était de l'objet DateTime.Obtenir le fuseau horaire de DateTime

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

Répondre

112

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

DateTimeOffset est un peu mieux - c'est essentiellement une heure UTC et un décalage. Cependant, ce n'est pas encore assez pour déterminer le fuseau horaire, car de nombreux fuseaux horaires différents peuvent avoir le même décalage à un moment donné. Cela semble être assez bon pour vous, car tout ce que vous avez à faire lorsque vous analysez la date et l'heure est le décalage. La prise en charge des fuseaux horaires à partir de .NET 3.5 est beaucoup mieux que ce qu'elle était, mais j'aimerais vraiment voir un standard "ZonedDateTime" ou quelque chose comme ça - une heure UTC et un fuseau horaire réel. Il est facile de créer le vôtre, mais ce serait bien de le voir dans les bibliothèques standard.

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

+2

Le projet PublicDomain sur CodePlex fait cela pour vous. – Cheeso

+0

Une énumération TimeZone dans la BCL serait bien si les fuseaux horaires mondiaux sont statiques et ne changent pas. – jlafay

+1

@jlafay: Cependant, ils changent - d'autres fuseaux horaires ont été ajoutés à Windows l'année dernière, par exemple. –

29

No.

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

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

Donc, mon conseil est d'écrire un petit cours d'emballage adapté à vos besoins.

2

Vous pouvez utiliser TimeZoneInfo classe

La classe TimeZone reconnaît fuseau horaire local, et peut convertir les temps 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 dans un fuseau horaire à l'heure correspondante dans n'importe quel autre fuseau horaire. Les membres de la classe TimeZoneInfo prennent en charge les opérations suivantes:

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

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

  3. Temps de conversion 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.

+1

... mais, étant donné un DateTime, il n'y a toujours pas un moyen d'utiliser TimeZoneInfo pour déterminer le TimeZone DateTime, à ma connaissance. –

+1

oui Jon Skeet a raison à ce sujet – Shekhar

Questions connexes