Pregunta Dado un objeto DateTime, ¿cómo obtengo una fecha ISO 8601 en formato de cadena?


Dado:

DateTime.UtcNow

¿Cómo obtengo una cadena que representa el mismo valor en un ISO 8601¿formato compatible?

Tenga en cuenta que ISO 8601 define una cantidad de formatos similares. El formato específico que estoy buscando es:

yyyy-MM-ddTHH:mm:ssZ

598
2017-09-22 13:56


origen


Respuestas:


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

Esto te da una fecha similar a 2008-09-22T13: 57: 31.2311892-04: 00.

Otra forma es:

DateTime.UtcNow.ToString("o");

que te da 2008-09-22T14: 01: 54.9571247Z

Para obtener el formato especificado, puede usar:

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

Opciones de formateo de DateTime


610
2017-09-22 14:00



DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture) debe darle lo que está buscando, ya que el especificador de formato "s" se describe como un patrón de fecha / hora ordenable; cumple con ISO 8601.


269
2017-09-22 14:06



DateTime.UtcNow.ToString("s")

Devuelve algo como 2008-04-10T06: 30: 00

UtcNow obviamente devuelve un UTC tiempo para que no haya daño en:

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

58
2017-09-22 13:59



Utilizar:

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

}

SALIDA

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

Fuentes:


24
2017-09-17 22:10



Puedes obtener la "Z" (ISO 8601  UTC) con el siguiente código:

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


Aquí es por qué:

El ISO 8601 tiene algunos formatos diferentes:

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 nos proporciona una enumeración con esas opciones:

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

Nota: Si aplica Visual Studio 2008 "ver utilidad" a la toString ("o") Es posible que obtengas resultados diferentes, no sé si es un error, pero en este caso tienes mejores resultados al utilizar una variable String si estás depurando.

Fuente: Cadenas estándar de formato de fecha y hora (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 debe usar DateTime en ISO 8601, ToString ("o") debería dar lo que está buscando. Por ejemplo,

2015-07-06T12:08:27

Sin embargo, DateTime + TimeZone puede presentar otros problemas como se describe en la publicación del blog DateTime y DateTimeOffset en .NET: buenas prácticas y peligros comunes:

DateTime tiene innumerables trampas que están diseñadas para dar los errores de código:

1.- Los valores de DateTime con DateTimeKind.Unspecified son malas noticias.

2.- DateTime no se preocupa por UTC / Local al hacer comparaciones.

3.- Los valores DateTime no conocen cadenas de formato estándar.

4.- Analizar una cadena que tiene un marcador UTC con DateTime no garantiza un tiempo UTC.


17
2017-07-06 16:11



Yo solo usaría XmlConvert:

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

Preservará automáticamente la zona horaria.


15
2018-06-02 15:19



Para convertir DateTime.UtcNow a una representación de cadena de aaaa-MM-ddTHH: mm: ssZ, puede usar el método ToString () de la estructura DateTime con una cadena de formato personalizada. Al usar cadenas de formato personalizadas con DateTime, es importante recordar que debe escapar de sus separadores utilizando comillas simples.

Lo siguiente devolverá la representación de cadena que deseaba:

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

8
2017-11-26 21:55



La mayoría de estas respuestas tienen milisegundos / microsegundos, lo que claramente no es compatible con ISO 8601. La respuesta correcta sería:

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

Referencias


8
2017-12-05 17:11