c# - Convertir UTC/GMT en fonction de l'heure locale




datetime utc php (8)

En réponse à la suggestion de Dana:

L'exemple de code ressemble maintenant à:

string date = "Web service date"..ToString("R", ci);
DateTime convertedDate = DateTime.Parse(date);            
DateTime dt = TimeZone.CurrentTimeZone.ToLocalTime(convertedDate);

La date d'origine était le 20/08/08; le genre était UTC.

Les deux "convertDate" et "dt" sont les mêmes:

21/08/08 10:00:26; le genre était local

Nous développons une application C # pour un client de service Web. Cela fonctionnera sur Windows XP PC.

L'un des champs renvoyés par le service Web est un champ DateTime. Le serveur renvoie un champ au format GMT, c'est-à-dire avec un "Z" à la fin.

Cependant, nous avons constaté que .NET semble faire une sorte de conversion implicite et le temps était toujours de 12 heures.

L'exemple de code suivant résout cela dans une certaine mesure en ce que la différence de 12 heures a disparu, mais il ne tient pas compte de l'heure d'été NZ.

CultureInfo ci = new CultureInfo("en-NZ");
string date = "Web service date".ToString("R", ci);
DateTime convertedDate = DateTime.Parse(date);            

Selon ce site date :

Décalage UTC / GMT

Fuseau horaire standard: UTC / GMT +12 heures
Heure d'été: +1 heure
Décalage horaire actuel: UTC / GMT +13 heures

Comment pouvons-nous ajuster pour l'heure supplémentaire? Cela peut-il être fait par programme ou est-ce une sorte de réglage sur le PC?


J'ai eu le problème avec cela étant dans un ensemble de données étant poussé à travers le fil (webservice au client) qu'il changerait automatiquement parce que le champ DateType de DataColumn a été placé à local. Assurez-vous que vous vérifiez ce que le DateType est si vous expulsez des DataSets.

Si vous ne voulez pas que cela change, définissez-le sur Non spécifié


Je sais que c'est une question plus ancienne, mais j'ai rencontré une situation similaire, et je voulais partager ce que j'avais trouvé pour les futurs chercheurs, y compris peut-être moi-même :).

DateTime.Parse() peut être difficile - voir here par exemple.

Si le DateTime provient d'un service Web ou d'une autre source avec un format connu, vous pouvez envisager quelque chose comme

DateTime.ParseExact(dateString, 
                   "MM/dd/yyyy HH:mm:ss", 
                   CultureInfo.InvariantCulture, 
                   DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal)

ou, encore mieux,

DateTime.TryParseExact(...)

L'indicateur AssumeUniversal indique à l'analyseur que la date / heure est déjà UTC; la combinaison de AssumeUniversal et AdjustToUniversal dit de ne pas convertir le résultat en temps "local", ce qu'il va essayer de faire par défaut. (Personnellement, j'essaie de traiter exclusivement avec UTC dans le (s) couche (s) business / application / service (s) Mais contourner la conversion en heure locale accélère également les choses - de 50% ou plus dans mes tests, voir ci-dessous.)

Voici ce que nous faisions avant:

DateTime.Parse(dateString, new CultureInfo("en-US"))

Nous avions profilé l'application et constaté que le DateTime.Parse représentait un pourcentage important de l'utilisation du processeur. (Incidemment, le constructeur CultureInfo n'était pas un contributeur significatif à l'utilisation du CPU.)

J'ai donc mis en place une application de console pour analyser une chaîne de date / heure 10000 fois de diverses façons. Bottom line:
Parse() 10 sec
ParseExact() (conversion en local) 20-45 ms
ParseExact() (ne pas convertir en local) 10-15 ms
... et oui, les résultats pour Parse() sont en secondes , alors que les autres sont en millisecondes .


Je suis tombé sur cette question car j'avais un problème avec les dates UTC que vous obtenez à travers l'API twitter (champ created_at sur un statut); J'ai besoin de les convertir en DateTime. Aucun des exemples de réponses / codes dans les réponses sur cette page n'a été suffisant pour m'empêcher d'obtenir une erreur "La chaîne n'a pas été reconnue comme une DateTime valide" (mais c'est le plus proche que j'ai pour trouver la bonne réponse SO)

Poster ce lien ici au cas où cela aiderait quelqu'un d'autre - la réponse dont j'avais besoin a été trouvée sur ce blog: http://www.wduffy.co.uk/blog/parsing-dates-when-aspnets-datetimeparse-doesnt-work/ - Utilisez essentiellement DateTime.ParseExact avec une chaîne de format au lieu de DateTime.Parse


N'oubliez pas que si vous avez déjà un objet DateTime et n'êtes pas sûr si c'est UTC ou Local, il est assez facile d'utiliser directement les méthodes sur l'objet:

DateTime convertedDate = DateTime.Parse(date);
DateTime localDate = convertedDate.ToLocalTime();

Comment pouvons-nous ajuster pour l'heure supplémentaire?

Sauf indication contraire .net utilisera les paramètres du PC local. J'aurais une lecture de: http://msdn.microsoft.com/en-us/library/system.globalization.daylighttime.aspx

Par l'apparence, le code pourrait ressembler à quelque chose comme:

DaylightTime daylight = TimeZone.CurrentTimeZone.GetDaylightChanges( year );

Et comme mentionné ci-dessus, vérifiez le réglage du fuseau horaire de votre serveur. Il existe des articles sur le net pour savoir comment affecter en toute sécurité les changements dans IIS.


Pour les chaînes telles que 2012-09-19 01:27:30.000 , DateTime.Parse ne peut pas indiquer de quel fuseau horaire provient la date et l'heure.

DateTime a une propriété Kind , qui peut avoir l'une des trois options de fuseau horaire:

  • Non spécifié
  • Local
  • UTC

REMARQUE Si vous souhaitez représenter une date / heure autre que UTC ou votre fuseau horaire local, vous devez utiliser DateTimeOffset .

Donc pour le code dans votre question:

DateTime convertedDate = DateTime.Parse(dateStr);

var kind = convertedDate.Kind; // will equal DateTimeKind.Unspecified

Vous dites que vous savez de quel genre il s'agit, alors dites-le.

DateTime convertedDate = DateTime.SpecifyKind(
    DateTime.Parse(dateStr),
    DateTimeKind.Utc);

var kind = convertedDate.Kind; // will equal DateTimeKind.Utc

Maintenant, une fois que le système connaît son heure UTC, vous pouvez simplement appeler ToLocalTime :

DateTime dt = convertedDate.ToLocalTime();

Cela vous donnera le résultat dont vous avez besoin.


@TimeZoneInfo.ConvertTimeFromUtc(timeUtc, TimeZoneInfo.Local)

TimeZone.CurrentTimeZone.ToLocalTime(date);






utc