2012-10-09 5 views
-2

Je reçois la chaîne datetime ci-dessous à partir d'un service Web et essaie de la transformer en objet datetime UTC mais une exception est levée.Exception lors de la conversion d'une chaîne UTC en DateTime

try 
{ 
    string ReceivedDateTimeString = "2012-10-09T07:42:13.409191Z"; 
    DateTime TransformedReceivedDateTimeString = DateTime.ParseExact(ReceivedDateTimeString, "o", CultureInfo.InvariantCulture, DateTimeStyles.None); 
} 
catch (Exception e) 
} 

Pourquoi une exception est-elle levée? Y at-il un problème avec le format de la chaîne ou avec ma transformation?

+0

Partie 2 de quoi? – Niklas

+0

http://stackoverflow.com/questions/12705874/utc-string-to-datetime-exception - désolé ne peut pas utiliser le même titre de question – cs0815

+1

IMHO les downvotes sont un peu dur. Aucune des questions liées ne donne une réponse qui s'applique clairement à ce scénario. – Joe

Répondre

1

Qu'en est-ce:

DateTime TransformedReceivedDateTimeString = DateTime.Parse(ReceivedDateTimeString).ToUniversalTime(); 
+1

Je suppose que vous devez définir que c'est supposé être aussi UTC? Donc, je ne vois pas beaucoup de différence. – cs0815

+0

Vous avez juste besoin de convertir en UTC –

+0

Voulez-vous dire: DateTime.Parse (ReceivedDateTimeString) .ToUniversalTime()? – cs0815

1

Eh bien, on vous a donné la bonne réponse la dernière fois par Jon Skeet: UTC string to DateTime exception

Notez qu'il ya 7 fs là, mais vous avez seulement a eu 6 décimales.

C'est la même erreur maintenant. Vous avez trois solutions possibles:

  1. Comme vous l'avez dit sur votre question précédente (comment), vous pourriez avoir vos données de fournisseur vous envoie les données au format standard.
  2. Si vous n'avez pas accès aux données, vous pouvez changer le paramètre de style à un format personnalisé: "yyyy-MM-ddTHH:mm:ss.ffffffK"
  3. Ou, vous pouvez ajouter une autre décimale à la fin de suivre le format standard: "2012-10-09T07:42:13.4091910Z";

Modifier le format standard

+1

Si j'essaye d'analyser une entrée qui provient vraisemblablement d'une source externe, il n'est pas très utile de dire "changer l'entrée". – Joe

+0

Merci Joe. C'est exactement mon point de vue! – cs0815

2

Essayez ceci:

string ReceivedDateTimeString = "2012-10-09T07:42:13.409191Z"; 
DateTime TransformedReceivedDateTimeString = 
    DateTime.ParseExact(ReceivedDateTimeString, 
         "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFFK", 
         CultureInfo.InvariantCulture, 
         DateTimeStyles.RoundTripKind); 

Les documentation for the "o" format specifier stipule que:

Le "O" ou "o" spécificateur de format standard correspondant à la « yyyy '-' MM '-' jj'T'HH ':' mm ':' ss'. Chaîne au format personnalisé 'fffffffK' pour les valeurs DateTime et à la chaîne de formatage personnalisée "aa" - 'MM' - 'dd'T'HH': 'mm': 'ss'. 'fffffffzzz "pour les valeurs DateTimeOffset.

I.e. 7 décimales, pas 6 comme dans votre chaîne.

La chaîne mise en forme peut être analysé de nouveau en utilisant le DateTimeParse (String, IFormatProvider, DateTimeStyles) ou la méthode DateTimeParseExact si le paramètre de styles est réglé sur DateTimeStyles.RoundtripKind.

I.e. vous devez spécifier DateTimeStyles.RoundtripKind.

Dans ce qui précède, j'ai utilisé "FFF ..." plutôt que "fff ..." car cela acceptera un nombre variable de décimales (les nombres décimaux manquants sont traités comme zéro). Ceci est conforme au principe d'être "tolérant à l'entrée, strict sur la sortie".

J'ai également spécifié DateTimeStyles.RoundtripKind pour préserver la propriété Kind lors de l'analyse (Utc dans ce cas). Si vous ne le faites pas, le résultat sera converti en heure locale.

Questions connexes