web-dev-qa-db-fra.com

Comment analyser et générer des objets DateTime au format ISO 8601

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")
14

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.

24
Nate Barbettini

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");
14

Réponse simple: DateTime.UtcNow.ToString("o")

0
Tim P.