formato de fecha aaaa-MM-ddTHH: mm: ssZ


102

Supongo que esto debería ser bastante simple, pero no pude obtenerlo :(. En este formato, Z es la zona horaria.
T es un patrón de tiempo largo
¿Cómo podría obtener una fecha en este formato, excepto usando

DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-ddTHH:mm:ssZ"));

C ª#


Sé que esta pregunta ha existido durante 9 años, pero la respuesta aceptada UtcNow.ToString(s)+Zes incorrecta. ISO8601 es compatible con la opción RoundTripToString("O") . También para señalar que la respuesta aceptada usa el valor UTC de la fecha y hora, que siempre daría la zona horaria Z, en lugar de solo usar el valor de fecha y hora real, que (si Kind = Local) puede contener una zona horaria de verano. ¿Considera cambiar la respuesta aceptada?
Richardissimo

Respuestas:


144

Usando UTC

ISO 8601 ( formatos de fecha y hora de MSDN )

Console.WriteLine(DateTime.UtcNow.ToString("s") + "Z");

2009-11-13T10: 39: 35Z

La Z está ahí porque

Si la hora está en UTC, agregue una 'Z' directamente después de la hora sin espacios. 'Z' es el designador de zona para el desplazamiento UTC cero. Por lo tanto, "09:30 UTC" se representa como "09: 30Z" o "0930Z". "14:45:15 UTC" sería "14: 45: 15Z" o "144515Z".

Si desea incluir una compensación

int hours = TimeZoneInfo.Local.BaseUtcOffset.Hours;
string offset = string.Format("{0}{1}",((hours >0)? "+" :""),hours.ToString("00"));
string isoformat = DateTime.Now.ToString("s") + offset;
Console.WriteLine(isoformat);

Dos cosas a tener en cuenta: + o - es necesario después del tiempo, pero obviamente + no se muestra en números positivos. Según wikipedia, el desplazamiento puede estar en formato + hh o + hh: mm. Me he limitado a solo unas horas.

Hasta donde yo sé, RFC1123 (fecha HTTP, el formateador "u") no está destinado a dar compensaciones de zona horaria. Todas las horas deben ser GMT / UTC.


Frio. Sin embargo, ¿su salida no incluye el desplazamiento TZ?
Neil Barnwell

Lo agregué: los documentos dicen que el formato 's' se basa en ISO8601, no creo que incluya la zona horaria.
Chris S

Oh, por supuesto, UTC no tiene zonas horarias. D'oh. Solicita información sobre la zona horaria en su salida. ¿Quizás el DateTimeOffset es lo que está buscando?
Neil Barnwell

5
Agregar Z allí manualmente no es bueno, debe usar .ToString ("o") porque le dará la salida adecuada. Si los milisegundos son un problema, deben redondearse. Agregar Z manualmente puede dar un resultado incorrecto si lo agrega a la hora local, que en realidad no es UTC.
Tuukka Lindroos

67
Console.WriteLine(DateTime.UtcNow.ToString("o"));  
Console.WriteLine(DateTime.Now.ToString("o"));

Salidas:

2012-07-09T19:22:09.1440844Z  
2012-07-09T12:22:09.1440844-07:00

Usé Console.WriteLine (DateTime.Now.ToString ("o")) ;. Gracias
Ziggler

5
La respuesta aceptada dice usar el especificador de formato "s" y agregar una Z al final para las fechas UTC. Eso está muy bien si no necesita los milisegundos, pero si desea los milisegundos, debe usar "o" como muestra esta respuesta. Con "o", los milisegundos se muestran por defecto y la Z ya está agregada al final de las fechas UTC.
Jim

1
DateTime.Now.ToString ("o") Resuelve todo tipo de problemas porque devuelve el desplazamiento correcto con él.
Mo Zaatar

12

El formato "o" es diferente para DateTime vs DateTimeOffset :(

DateTime.UtcNow.ToString("o") -> "2016-03-09T03:30:25.1263499Z"

DateTimeOffset.UtcNow.ToString("o") -> "2016-03-09T03:30:46.7775027+00:00"

Mi respuesta final es

DateTimeOffset.UtcDateTime.ToString("o")   //for DateTimeOffset type
DateTime.UtcNow.ToString("o")              //for DateTime type

7

En C # 6+ puede usar la interpolación de cadenas y hacer esto más conciso:

$"{DateTime.UtcNow:s}Z"

me ahorraste mucho tiempo. Solución sencilla y dulce.
Raju Paladiya


5

Código de línea única para esto.

var temp   =  DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");

5

Una opción podría ser convertir DateTime a ToUniversalTime () antes de convertir a una cadena usando el formato "o" . Por ejemplo,

var dt = DateTime.Now.ToUniversalTime();
Console.WriteLine(dt.ToString("o"));

Saldrá:

2016-01-31T20:16:01.9092348Z

2

Funciona bien con formatos de fecha y hora de consulta de API REST de Salesforce

DateTime now = DateTime.UtcNow;
string startDate = now.AddDays(-5).ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");   
string endDate = now.ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");  
//REST service Query 
string salesforceUrl= https://csxx.salesforce.com//services/data/v33.0/sobjects/Account/updated/?start=" + startDate + "&end=" + endDate;

// https://csxx.salesforce.com/services/data/v33.0/sobjects/Account/updated/?start=2015-03-10T15:15:57Z&end=2015-03-15T15:15:57Z

Devuelve los resultados de Salesforce sin ningún problema.


-6

Podría dividir las cosas, requeriría más código, pero funcionaría de la manera que desee:

DateTime year = DateTime.Now.Year;
DateTime month = DateTime.Now.Month;
DateTime day = DateTime.Now.Day;

ect.

finalmente:

Console.WriteLine(year+month+day+etc.);

Sin embargo, esta es una forma muy audaz de manejarlo ...


Esta respuesta no produce nada como el resultado deseado
cja

Esto no proporcionó lo que la pregunta o yo quería ... -1
Ziggler
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.