Question Étant donné un objet DateTime, comment obtenir une date ISO 8601 en format de chaîne?


Donné:

DateTime.UtcNow

Comment puis-je obtenir une chaîne qui représente la même valeur dans un ISO 8601-formulaire conforme?

Notez que ISO 8601 définit un certain nombre de formats similaires. Le format spécifique que je cherche est:

yyyy-MM-ddTHH:mm:ssZ

598
2017-09-22 13:56


origine


Réponses:


DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffffffzzz");

Cela vous donne une date similaire à 2008-09-22T13: 57: 31.2311892-04: 00.

Une autre façon est:

DateTime.UtcNow.ToString("o");

ce qui vous donne 2008-09-22T14: 01: 54.9571247Z

Pour obtenir le format spécifié, vous pouvez utiliser:

DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")

Options de formatage DateTime


610
2017-09-22 14:00



DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture) devrait vous donner ce que vous cherchez car le spécificateur de format "s" est décrit comme un modèle de date / heure triable; conforme à l'ISO 8601.


269
2017-09-22 14:06



DateTime.UtcNow.ToString("s")

Renvoie quelque chose comme 2008-04-10T06: 30: 00

UtcNow de toute évidence renvoie un UTC temps donc il n'y a pas de mal à:

string.Concat(DateTime.UtcNow.ToString("s"), "Z")

58
2017-09-22 13:59



Utilisation:

private void TimeFormats()
{
    DateTime localTime = DateTime.Now;
    DateTime utcTime = DateTime.UtcNow;
    DateTimeOffset localTimeAndOffset = new DateTimeOffset(localTime, TimeZoneInfo.Local.GetUtcOffset(localTime));

    //UTC
    string strUtcTime_o = utcTime.ToString("o");
    string strUtcTime_s = utcTime.ToString("s");
    string strUtcTime_custom = utcTime.ToString("yyyy-MM-ddTHH:mm:ssK");

    //Local
    string strLocalTimeAndOffset_o = localTimeAndOffset.ToString("o");
    string strLocalTimeAndOffset_s = localTimeAndOffset.ToString("s");
    string strLocalTimeAndOffset_custom = utcTime.ToString("yyyy-MM-ddTHH:mm:ssK");

    //Output
    Response.Write("<br/>UTC<br/>");
    Response.Write("strUtcTime_o: " + strUtcTime_o + "<br/>");
    Response.Write("strUtcTime_s: " + strUtcTime_s + "<br/>");
    Response.Write("strUtcTime_custom: " + strUtcTime_custom + "<br/>");

    Response.Write("<br/>Local Time<br/>");
    Response.Write("strLocalTimeAndOffset_o: " + strLocalTimeAndOffset_o + "<br/>");
    Response.Write("strLocalTimeAndOffset_s: " + strLocalTimeAndOffset_s + "<br/>");
    Response.Write("strLocalTimeAndOffset_custom: " + strLocalTimeAndOffset_custom + "<br/>");

}

SORTIE

UTC
    strUtcTime_o: 2012-09-17T22:02:51.4021600Z
    strUtcTime_s: 2012-09-17T22:02:51
    strUtcTime_custom: 2012-09-17T22:02:51Z

Local Time
    strLocalTimeAndOffset_o: 2012-09-17T15:02:51.4021600-07:00
    strLocalTimeAndOffset_s: 2012-09-17T15:02:51
    strLocalTimeAndOffset_custom: 2012-09-17T22:02:51Z

Sources:


24
2017-09-17 22:10



Vous pouvez obtenir le "Z" (ISO 8601  UTC) avec le code suivant:

Dim tmpDate As DateTime = New DateTime(Now.Ticks, DateTimeKind.Utc)
Dim res as String = tmpDate.toString("o") '2009-06-15T13:45:30.0000000Z


Voici pourquoi:

L'ISO 8601 a des formats différents:

DateTimeKind.Local

2009-06-15T13:45:30.0000000-07:00

DateTimeKind.Utc

2009-06-15T13:45:30.0000000Z

DateTimeKind.Unspecified

2009-06-15T13:45:30.0000000


.NET nous fournit une énumération avec ces options:

'2009-06-15T13:45:30.0000000-07:00
Dim strTmp1 As String = New DateTime(Now.Ticks, DateTimeKind.Local).ToString("o")

'2009-06-15T13:45:30.0000000Z
Dim strTmp2 As String = New DateTime(Now.Ticks, DateTimeKind.Utc).ToString("o")

'2009-06-15T13:45:30.0000000
Dim strTmp3 As String = New DateTime(Now.Ticks, DateTimeKind.Unspecified).ToString("o")

Remarque: Si vous appliquez l'utilitaire de surveillance "Visual Studio 2008" à toString ("o") En partie, vous pouvez obtenir des résultats différents, je ne sais pas si c'est un bug, mais dans ce cas, vous avez de meilleurs résultats en utilisant une variable String si vous déboguez.

La source: Chaînes de format de date et d'heure standard (MSDN)


18
2017-09-17 14:31



System.DateTime.UtcNow.ToString("o")

=>

val it : string = "2013-10-13T13:03:50.2950037Z"

17
2017-10-13 13:05



Si vous devez utiliser DateTime à ISO 8601, alors ToString ("o") devrait produire ce que vous recherchez. Par exemple,

2015-07-06T12:08:27

Cependant, DateTime + TimeZone peut présenter d'autres problèmes comme décrit dans le blog DateTime et DateTimeOffset dans .NET: Bonnes pratiques et pièges courants:

DateTime a d'innombrables pièges qui sont conçus pour donner vos bogues de code:

1.- Les valeurs DateTime avec DateTimeKind.Unspecified sont de mauvaises nouvelles.

2.- DateTime ne se soucie pas de UTC / Local lors des comparaisons.

3.- Les valeurs DateTime ne sont pas au courant des chaînes de format standard.

4.- L'analyse d'une chaîne ayant un marqueur UTC avec DateTime ne garantit pas une heure UTC.


17
2017-07-06 16:11



Je voudrais juste utiliser XmlConvert:

XmlConvert.ToString(DateTime.UtcNow, XmlDateTimeSerializationMode.RoundtripKind);

Il conservera automatiquement le fuseau horaire.


15
2018-06-02 15:19



Pour convertir DateTime.UtcNow en une représentation de chaîne de aaaa-MM-ddTHH: mm: ssZ, vous pouvez utiliser la méthode ToString () de la structure DateTime avec une chaîne de mise en forme personnalisée. Lorsque vous utilisez des chaînes de format personnalisé avec un DateTime, il est important de se rappeler que vous devez échapper à vos séparateurs en utilisant des guillemets simples.

Ce qui suit va retourner la représentation de la chaîne que vous vouliez:

DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", DateTimeFormatInfo.InvariantInfo)

8
2017-11-26 21:55



La plupart de ces réponses ont des millisecondes / microsecondes, ce qui n'est clairement pas supporté par ISO 8601. La bonne réponse serait:

System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssK");
// or
System.DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");

Les références:


8
2017-12-05 17:11



le "s" spécificateur de format standard représente une chaîne de format de date et d'heure personnalisée définie par le DateTimeFormatInfo.SortableDateTimePattern propriété. Le motif reflète une norme définie (ISO 8601), et la propriété est en lecture seule. Par conséquent, c'est toujours pareil, indépendamment de la culture utilisée ou du fournisseur de format fourni. La chaîne de format personnalisé est "yyyy'-'MM'-'dd'T'HH':'mm':'ss".

Lorsque ce spécificateur de format standard est utilisé, l'opération de formatage ou d'analyse utilise toujours la culture invariante.

- de MSDN


7
2017-09-12 10:12