117 votes

Obtenir le fuseau horaire à partir de DateTime

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

J'ai une bibliothèque qui analyse DateTime à partir d'un format qui comporte "+zz" à la fin, et bien qu'elle analyse correctement et ajuste l'heure locale, j'ai besoin d'obtenir le fuseau horaire spécifique de l'objet DateTime.

Est-ce possible ? Tout ce que je vois, c'est DateTime.Kind, qui indique si l'heure est locale ou UTC.

1 votes

Voir les notes sur Documentation sur DateTime.Parse pour la gestion des fuseaux horaires et des DateTimeStyles. Mais non, ce que vous voulez n'est pas vraiment possible.

155voto

Jon Skeet Points 692016

DateTime lui-même ne contient aucune information réelle sur le fuseau horaire. Il s'agit de mai savent si c'est UTC ou local, mais pas ce que local signifie vraiment.

DateTimeOffset est un peu mieux - il s'agit essentiellement d'une heure UTC et d'un décalage. Cependant, ce n'est toujours pas suffisant pour déterminer le fuseau horaire, car de nombreux fuseaux horaires différents peuvent avoir le même décalage à un moment donné. Il semble que cela soit suffisant pour vous, car tout ce que vous avez à faire lors de l'analyse de la date et de l'heure est le décalage.

La prise en charge des fuseaux horaires depuis .NET 3.5 est bien meilleure qu'avant, mais j'aimerais vraiment voir un "ZonedDateTime" standard ou quelque chose comme ça - une heure UTC et un fuseau horaire réel. Il est facile de créer sa propre application, mais ce serait bien de la voir dans les bibliothèques standard.

EDIT : Près de quatre ans plus tard, je suggérerais maintenant d'utiliser Heure de Noda qui dispose d'un ensemble plus riche de types de date/heure. Je suis cependant partial, étant l'auteur principal de Noda Time :)

2 votes

Le projet PublicDomain sur CodePlex le fait pour vous.

0 votes

Un enum TimeZone dans la BCL serait bien si les fuseaux horaires du monde sont statiques et ne changent pas.

1 votes

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

39voto

Gerrie Schenck Points 13421

Non.

Un développeur est responsable du suivi des informations relatives au fuseau horaire associées à une valeur DateTime via un mécanisme externe.

Une citation d'un excellent article ici . Une lecture indispensable pour tout développeur .Net.

Je vous conseille donc d'écrire une petite classe enveloppante qui répond à vos besoins.

5voto

Cheeso Points 87022

Il existe un Bibliothèque TimeZone du domaine public pour .NET . Très utile. Il répondra à vos besoins.

Résoudre le problème des fuseaux horaires dans le cas général est plus difficile que vous ne le pensez.

3voto

Shekhar Points 518

Vous pourriez utiliser TimeZoneInfo classe

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 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 d'un fuseau horaire déjà défini par le système d'exploitation. d'exploitation.

  2. Enumé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.

1 votes

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

0 votes

@RemiDespres-Smyth Je stocke simplement TimeZoneInfo avec DateTime dans une classe.

2voto

Muxa Points 2425

Il existe également zoneinfo.codeplex.com

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X