Il y a ce service Web SOAP qui m'envoie des objets datetime au format suivant
2016-03-29T12:20:35.093-05:00
C'est le jour 29 de mars 2016. Heure: 12: 20: 35.093 (GMT-5).
Je veux pouvoir créer un objet DateTime
, comme ceci:
DateTime.Now
et obtenir la représentation de chaîne dans le format décrit ci-dessus, ainsi que l'opération inverse, créer un DateTime à partir d'une chaîne semblable à celle donnée ci-dessus.
J'ai essayé ce qui suit afin de créer la date:
new DateTime(2016, 3, 29, 12, 20, 35, 093, DateTimeKind.Utc)
Cependant, je ne vois pas comment spécifier GMT-5 ici ...
Je ne sais pas non plus comment convertir un DateTime au format de chaîne spécifié.
En utilisant le code de Nate, je fais ce qui suit:
var d = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-3));
FormatIso8601(d)
Toutefois, cet appel renvoie: "2016-03-29T15: 20: 35Z" au lieu de:
"2016-03-29T12:20:35.093-03:00"
c'est ce dont j'ai réellement besoin.
Je pense que cela fonctionne:
d.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz")
Le format que vous décrivez est ISO 8601 .
Puisque vous travaillez avec des horodatages qui incluent un composant de fuseau horaire, je vous recommande vivement d'utiliser DateTimeOffset
au lieu de DateTime
. Cela rend les choses tellement plus faciles!
Pour créer une DateTimeOffset
pour un décalage de date, d'heure et de fuseau horaire donné, utilisez la syntaxe suivante:
var date = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-5));
// March 29, 2016 at 12:20:35.93 GMT-5
Ce code formatera une DateTimeOffset
comme ISO 8601:
public static string FormatIso8601(DateTimeOffset dto)
{
string format = dto.Offset == TimeSpan.Zero
? "yyyy-MM-ddTHH:mm:ss.fffZ"
: "yyyy-MM-ddTHH:mm:ss.fffzzz";
return dto.ToString(format, CultureInfo.InvariantCulture);
}
Et, pour analyser une chaîne en retour dans une DateTimeOffset
:
public static DateTimeOffset ParseIso8601(string iso8601String)
{
return DateTimeOffset.ParseExact(
iso8601String,
new string[] { "yyyy-MM-dd'T'HH:mm:ss.FFFK" },
CultureInfo.InvariantCulture,
DateTimeStyles.None);
}
Si vous devez revenir à une DateTime
, vous pouvez l'obtenir à partir de la DateTimeOffset
. UtcDateTime
property.
Un moyen plus simple consiste à utiliser la méthode ToString sur DateTimeOffset avec l'argument "o". Ceci imprime automatiquement la date au format ISO8601
DateTimeOffset.Now.ToString("o");
La méthode d'analyse statique est également capable d'analyser correctement une date au format ISO8601.
DateTimeOffset.Parse("2016-25-12T20:45:30.3124+01:00");
DateTimeOffset.Parse("2016-25-12T20:45:30.3124Z");
Réponse simple: DateTime.UtcNow.ToString("o")