Comment convertir une chaîne en heure locale?

J’essaie de convertir une chaîne de ce format:

MM/dd/yyyy HH:mm 

L’entrée provient d’une firebase database américaine, c’est-à-dire: 09/20/2010 14:30

Je sais que ma chaîne est toujours l’heure américaine, mais lorsque je l’affiche, je dois la traduire en heure locale. Cette chaîne doit donc être transformée en:

 09/20/2010 19:30 (for UK for instance) 

J’ai essayé quelques solutions, mais rien ne semble me donner la solution correcte lorsque j’utilise une machine américaine par rapport à une machine britannique ou géante que j’ai essayée:

 CompletedDttm = DateTime.ParseExact(value, "MM/dd/yyyy HH:mm", CultureInfo.CurrentCulture); CompletedDttm = DateTime.ParseExact(value, "MM/dd/yyyy HH:mm", new CultureInfo("en-US")); 

Ils travaillent tous localement (machine américaine) mais ne convertissent pas l’heure en heure locale sur une machine européenne.

Merci Tony

Essayez ceci – il convertit l’heure locale (entrée au format américain) en GMT puis s’imprime au format GB / DE.

 var zones = TimeZoneInfo.GetSystemTimeZones(); // resortingeve timezone info ssortingng value = "09/20/2010 14:30"; DateTime CompletedDttm = DateTime.ParseExact(value, "MM/dd/yyyy HH:mm", new CultureInfo("en-US")); DateTime FinalDttm = TimeZoneInfo.ConvertTime(CompletedDttm, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"), TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time")); ssortingng output = FinalDttm.ToSsortingng(new CultureInfo("en-GB")); FinalDttm = TimeZoneInfo.ConvertTime(CompletedDttm, TimeZoneInfo.Local, TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time")); output = FinalDttm.ToSsortingng(new CultureInfo("de-DE")); 

La sortie est, à son tour:

20/09/2010 19:30:00

20.09.2010 20:30:00

MISE À JOUR: Vous devez connaître le fuseau horaire des données (pas seulement qu’il s’agit de “US”) ainsi que de la machine d’interprétation si vous souhaitez le convertir de manière fiable en toute autre chose. Vous ne regardez pas seulement le décalage horaire, mais également l’heure d’été qui varie selon les lieux (tous les pays ne s’y plient pas). Est est soit -4 ou -5 en fonction de la période de l’année. Et si la date est suffisamment ancienne, vous constaterez que les dates “d’été” ont été modifiées récemment.

Votre meilleur moyen consiste à TOUJOURS stocker les horodatages au format UTC. En dehors de cela, vous pouvez simplement deviner le décalage.


Vous devez travailler avec les heures UTC (la nouvelle version légèrement différente de GMT) si vous souhaitez effectuer la conversion vers d’autres fuseaux horaires.

 DateTime dt = new DateTime(DateTime.Parse('2010-10-06 19:40').Ticks, DateTimeKind.Local); dt.AddHours(5); dt.ToLocalTime(); 

Vous pouvez également utiliser TimeZoneInfo qui contiendra également les informations DST.

Sauf indication contraire de votre part, l’parsing supposera que vous entendez parsingr la chaîne dans votre fuseau horaire actuel. La culture américaine désigne simplement le format attendu de la chaîne et n’a rien à voir avec le fuseau horaire (par exemple, aux États-Unis, il peut s’agir de l’EST ou de la PST).

Votre chaîne ne contient aucune information sur le fuseau horaire. Vous allez donc naturellement obtenir votre valeur quel que soit le fuseau horaire local. Tu peux soit:

  1. Ajouter les informations de fuseau horaire
  2. Changer le fuseau horaire après

Je pense que c’est un problème d’affichage, mais j’ai besoin de plus d’informations pour en être sûr. Essayez d’afficher les dates au format aaaa-MM-jj dans les deux cas pour vérifier si le problème est en cours d’parsing ou d’affichage. Vous pouvez créer un object d’informations de format personnalisé si vous savez exactement ce que vous souhaitez accepter ou afficher:

  public static DateTimeFormatInfo GetISOFormatInfo() { DateTimeFormatInfo dtFormat = new DateTimeFormatInfo(); dtFormat.DateSeparator = "-"; dtFormat.TimeSeparator = ":"; dtFormat.ShortDatePattern = "yyyy-MM-dd"; dtFormat.ShortTimePattern = "HH:mm:ss"; return dtFormat; } 

En utilisant une information de Date sans TimeZone, vous ne pourrez pas connaître l’heure du Royaume-Uni / du Canada, etc., car vous ne savez pas qui (quelle partie du monde) a programmé cette heure. Étant donné que vous avez spécifiquement indiqué que l’heure est l’heure des États-Unis, vous pouvez append la différence de temps pour que les différentes parties du monde affichent l’heure locale.

Vous pouvez utiliser ssortingng.Split. d’abord avec le séparateur ‘/’ sur toute la chaîne. Vous obtiendrez “09”, “20” et “2010 14:30”, puis appliquerez la scission deux fois de plus avec “et”: ”