Format de date C #

Je rencontre un problème pour convertir ce format de date en un autre format. J’espérais que quelqu’un ici pourrait m’aider.

Voici mon code:

ssortingng fromFormat = "ddd, dd MM yyyy HH:mm:ss zzz"; ssortingng toFormat = "yyyy-MM-dd"; DateTime newDate = DateTime.ParseExact("Mon, 25 03 2013 00:00:00 GMT", fromFormat, null); Console.WriteLine(newDate.ToSsortingng(toFormat)); 

——-MODIFIER——–

J’ai réussi à me débarrasser de mes erreurs en changeant le jour de 22 à 25 . Mon nouveau numéro essaie d’obtenir le fuseau horaire permettant la conversion de GMT à EST. Quelqu’un aurait-il des idées?

——- EDIT # 2 ——-

Voici mon code actuel tel qu’il est. J’ai toujours des problèmes avec une conversion de fuseau horaire.

 var date = "Mon, 25 03 2013 00:00:00 GMT"; // Cuts off "GMT" portion of ssortingng ssortingng newdate = date.Subssortingng(0, 24); // Switches the output of date ssortingng fromFormat = "ddd, dd MM yyyy HH:mm:ss"; ssortingng toFormat = "yyyy-MM-dd"; DateTime newDate = DateTime.ParseExact(newdate, fromFormat, null); ssortingng finaldate = newDate.ToSsortingng(toFormat); // Output final date Console.WriteLine(finaldate); 

——- EDIT # 3 ——-

Le code:

 var input = "Mon, 25 03 2013 00:00:00 GMT"; var inner = input.Subssortingng(0, 24); var format = "ddd, dd MM yyyy HH:mm:ss"; var zoneId = "Eastern Standard Time"; var parsed = DateTime.ParseExact(inner, format, CultureInfo.InvariantCulture); var utcDateTime = DateTime.SpecifyKind(parsed, DateTimeKind.Utc); var eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(utcDateTime, zoneId); Console.WriteLine(eastern); 

L’erreur:

 Unhandled Exception: System.TimeZoneNotFoundException: Exception of type 'System.TimeZoneNotFoundException' was thrown. at System.TimeZoneInfo.FindSystemTimeZoneByFileName (System.Ssortingng id, System.Ssortingng filepath) [0x00000] in :0 at System.TimeZoneInfo.FindSystemTimeZoneById (System.Ssortingng id) [0x00000] in :0 at System.TimeZoneInfo.ConvertTimeBySystemTimeZoneId (DateTime dateTime, System.Ssortingng destinationTimeZoneId) [0x00000] in :0 at Program.Main () [0x00000] in :0 

Toute aide serait très appréciée! Merci!

——- FINAL EDIT ——-

C’est ce qui a fini par changer le fuseau horaire et à le convertir au format dont j’avais besoin. Un merci spécial à @MattJohnson pour toute son aide!

 // Cuts off 'GMT' portion of ssortingng var newdate = date.Subssortingng(0, 24); var fromFormat = "ddd, dd MM yyyy HH:mm:ss"; var toFormat = "yyyy-MM-dd"; var zoneId = "Eastern Standard Time"; var parsed = DateTime.ParseExact(newdate, fromFormat, CultureInfo.InvariantCulture); // Specifies UTC time and converts it to EST timezone var utcDateTime = DateTime.SpecifyKind(parsed, DateTimeKind.Utc); var eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(utcDateTime, zoneId); // Converts date to final format needed var finaldate = eastern.ToSsortingng(toFormat); 

Comme d’autres l’ont souligné, la valeur d’entrée que vous avez est auto-incohérente. Cela fait référence à un 22 mars 2013 comme à un lundi alors que c’est en réalité un vendredi. Vous devez donc revenir à vos données source et comprendre pourquoi cela se produit. Je suis sûr que vous avez entendu le dicton “Garbage In, Garbage Out”.

Si vous êtes sûr de vouloir ignorer le jour de la semaine et que le fuseau horaire sera toujours à l’heure GMT, procédez comme suit:

 var input = "Mon, 22 03 2013 00:00:00 GMT"; var inner = input.Subssortingng(5, 19); var format = "dd MM yyyy HH:mm:ss"; var parsed = DateTime.ParseExact(inner, format, CultureInfo.InvariantCulture); var utcDateTime = DateTime.SpecifyKind(parsed, DateTimeKind.Utc); 

Notez que j’ai explicitement défini le type sur UTC, car vous importez des valeurs GMT. GMT et UTC sont identiques à toutes fins utiles.

S’il est possible que d’autres valeurs de fuseau horaire soient passées, veuillez alors fournir un échantillon des différentes entrées possibles et nous pourrions peut-être trouver un moyen de prendre en compte cela.

En passant – cette chaîne ressemble beaucoup aux dates formatées RFC822 / RFC1123 , sauf que vous transmettez le mois en tant que nombre au lieu de l’une des abréviations à trois lettres. Avez-vous fait cela intentionnellement? Si oui, vous avez cassé la spécification pour ce format. Si votre intention était de supprimer les chaînes potentiellement localisables des données, veuillez utiliser un format déjà conçu à cet effet, tel que ISO8601 / RFC3339 .

Sur les fuseaux horaires

Vous avez dit que vous souhaitiez convertir en HNE. Vous voulez probablement dire «heure de l’Est des États-Unis», qui alterne heure de l’Est et HAE pour passer à l’heure avancée. Malgré cela, la firebase database Windows Time Zone utilise l’identifiant “Eastern Standard Time” pour faire référence aux deux valeurs – essayez donc de ne pas vous tromper sur ce point.

Une fois que vous avez la date en tant que DateTime of Utc , comme je l’ai montré ci-dessus, vous pouvez la convertir en heure de l’est avec les éléments suivants:

 var zoneId = "Eastern Standard Time"; // don't get confused here! :) var eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(utcDateTime, zoneId); 

Faites juste attention à ce que vous faites avec cette valeur. Si vous l’affichez à un utilisateur, tout va bien. Faites juste ceci:

 var s = eastern.ToSsortingng("g"); // or whatever format you want. 

Mais si vous faites des calculs avec ceci ou si vous le stockez comme une heure d’événement enregistrée, vous introduisez potentiellement des erreurs dans vos résultats. Cela est dû aux transitions d’heure avancée. Une façon d’éviter cela consiste à utiliser un type DateTimeOffset place:

 var utcDateTimeOffset = new DateTimeOffset(utcDateTime, TimeSpan.Zero); var eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(utcDateTimeOffset, zoneId); 

Désormais, lorsque vous utilisez ces valeurs, les ambiguïtés sont capturées par le décalage.

Si cela vous semble très déroutant, ne vous inquiétez pas, vous n’êtes pas seul. Vous voudrez peut-être essayer d’utiliser Noda Time à la place. Cela vous évitera de vous tirer une balle dans le pied.

 ssortingng fromFormat = "ddd, dd MM yyyy HH:mm:ss zzz"; 

L’erreur est votre zzz , il attend la représentation numérique du fuseau horaire , pas l’abréviation du fuseau horaire.

Donc, une version acceptable serait

 DateTime newDate = DateTime.ParseExact("Mon, 22 03 2013 00:00:00 +0:00", fromFormat, null); 

mais cela jetterait un FormatExecption différent avec le message “La chaîne n’a pas été reconnue comme un DateTime valide car le jour de la semaine était incorrect.” Si vous apportez la correction du lundi au vendredi, l’parsing fonctionne

 DateTime newDate = DateTime.ParseExact("Fri, 22 03 2013 00:00:00 +0:00", fromFormat, null); 

Je ne pense pas qu’il existe un spécificateur de format capable de prendre en compte la version d’abréviation textuelle du fuseau horaire.

Pour voir ce qui ne va pas, imprimez un DateTime utilisant votre fromSsortingng:

 DateTime dt = new DateTime(2013, 3, 22); ssortingng s = dt.ToSsortingng(fromFormat); 

vous verrez que le résultat est:

 Fri, 22 03 2013 00:00:00 -04:00 

c’est donc le format auquel on s’attendrait.

Vous pourrez peut-être obtenir de l’aide sur les abréviations de cet article .

Il y a deux problèmes:

1) Le jour choisi était un vendredi et non un lundi

2) Le ‘zzz’ veut un plus ou un moins 0:00

Donc, le faire fonctionner serait:

 ssortingng fromFormat = "ddd, dd MM yyyy HH:mm:ss zzz"; ssortingng toFormat = "yyyy-MM-dd"; DateTime newDate = DateTime.ParseExact("Fri, 22 03 2013 00:00:00 +0:00", fromFormat, null); Console.WriteLine(newDate.ToSsortingng(toFormat)); 

Il n’existe pas de moyen simple et intégré de convertir une abréviation de fuseau horaire en un décalage ou un nom propre. Ceci est discuté dans ce sujet ici:

Abréviations de fuseau horaire

Vous devrez soit créer un tableau des abréviations que vous souhaitez utiliser, mappé à un décalage ou à un nom approprié, soit modifier le format de votre chaîne de date / heure entrante pour utiliser des décalages.

 ssortingng fromFormat = "ddd, dd MM yyyy HH:mm:ss zzz"; ssortingng toFormat = "yyyy-MM-dd"; DateTime newDate = DateTime.ParseExact("Mon, 22 03 2013 00:00:00 +00:00", fromFormat, null); Console.WriteLine(newDate.ToSsortingng(toFormat)); 

22 03 2013 00:00:00 GMT n’est pas lundi c’est vendredi

essayer

  ssortingng fromFormat = "ddd, dd MM yyyy HH:mm:ss zzz"; ssortingng toFormat = "yyyy-MM-dd"; Console.WriteLine(DateTime.ParseExact("Fri, 22 03 2013 00:00:00 +00:00", fromFormat, CultureInfo.InvariantCulture).ToSsortingng(toFormat));