2009-11-30 55 views
48

Tengo un DateTime que quiero formatear a "2009-09-01T00: 00: 00.000Z", pero el siguiente código me da "2009-09-01T00: 00: 00.000 + 01: 00" (ambas líneas) :¿Cómo puedo formatear DateTime en formato web UTC?

new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz") 
new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz") 

Alguna idea de cómo hacer que funcione?

Respuesta

99
string foo = yourDateTime.ToUniversalTime() 
         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'"); 
+0

@Downvoter: ¿Te gustaría decirnos qué piensas que está mal con esta respuesta? – LukeH

+10

Esto funcionó pero .ToUniversalTime() estropeará su fecha existente si ya está en UTC pero la variable yourDateTime no lo especifica. Terminé eliminando .ToUniversalTime() y las fechas se alinearon con lo que se esperaba en ambos extremos (base de datos y cliente web). –

-2

Prueba esto:

DateTime date = DateTime.ParseExact(
    "Tue, 1 Jan 2008 00:00:00 UTC", 
    "ddd, d MMM yyyy HH:mm:ss UTC", 
    CultureInfo.InvariantCulture); 

Previously asked question

+3

No estoy tratando de analizarlo (aún), I Estoy tratando de imprimirlo. – Grzenio

3

que desea utilizar DateTimeOffset clase.

var date = new DateTimeOffset(2009, 9, 1, 0, 0, 0, 0, new TimeSpan(0L)); 
var stringDate = date.ToString("u"); 

lo siento no vi a su formato original con los milisegundos

var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'"); 
6

El mejor formato a utilizar es "aaaa '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffK ".

La última cadena K en K será cambiada a 'Z' si la fecha es UTC o con zona horaria (+ -hh: mm) si es local. (http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx)

Como dijo LukeH, es bueno utilizar la ToUniversalTime si desea que todas las fechas serán UTC.

El código final es:

string foo = yourDateTime.ToUniversalTime() 
         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK"); 
42

Por qué no sólo tiene que utilizar The Round-trip ("O", "o") Format Specifier?

La "O" u "o" especificador de formato estándar representa una cadena de formato de fecha y hora personalizado utilizando un patrón que se conserva la información de zona horaria y emite una cadena de resultado que cumpla con la norma ISO 8601. Para los valores de fecha y hora, este formato El especificador está diseñado para conservar los valores de fecha y hora junto con la propiedad DateTime.Kind en el texto. La cadena formateada se puede analizar sintácticamente utilizando el método DateTime.Parse (String, IFormatProvider, DateTimeStyles) o DateTime.ParseExact si el parámetro de estilos se establece en DateTimeStyles.RoundtripKind.

El especificador de formato estándar "O" o "o" corresponde a la cadena de formato personalizado "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' FffffffK" para DateTime valores y al "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffffffzzz" cadena de formato personalizado para los valores de DateTimeOffset. En esta cadena, los pares de comillas simples que delimitan caracteres individuales, como los guiones, los dos puntos y la letra "T", indican que el carácter individual es un literal que no puede modificarse. Los apóstrofes no aparecen en la cadena de salida.

El especificador de formato estándar O "o" o "(y el" aaaa "- 'MM' - 'dd'T'HH': 'mm': 'ss'. 'FffffffK" cadena de formato personalizado) aprovecha una de las tres formas en que la norma ISO 8601 representa la información de zona horaria para preservar la propiedad tipo de valores DateTime:

public class Example 
{ 
    public static void Main() 
    { 
     DateTime dat = new DateTime(2009, 6, 15, 13, 45, 30, 
            DateTimeKind.Unspecified); 
     Console.WriteLine("{0} ({1}) --> {0:O}", dat, dat.Kind); 

     DateTime uDat = new DateTime(2009, 6, 15, 13, 45, 30, 
            DateTimeKind.Utc); 
     Console.WriteLine("{0} ({1}) --> {0:O}", uDat, uDat.Kind); 

     DateTime lDat = new DateTime(2009, 6, 15, 13, 45, 30, 
            DateTimeKind.Local); 
     Console.WriteLine("{0} ({1}) --> {0:O}\n", lDat, lDat.Kind); 

     DateTimeOffset dto = new DateTimeOffset(lDat); 
     Console.WriteLine("{0} --> {0:O}", dto); 
    } 
} 
// The example displays the following output: 
// 6/15/2009 1:45:30 PM (Unspecified) --> 2009-06-15T13:45:30.0000000 
// 6/15/2009 1:45:30 PM (Utc) --> 2009-06-15T13:45:30.0000000Z 
// 6/15/2009 1:45:30 PM (Local) --> 2009-06-15T13:45:30.0000000-07:00 
//  
// 6/15/2009 1:45:30 PM -07:00 --> 2009-06-15T13:45:30.0000000-07:00 
+0

En la metaetiqueta como 'http-equiv =" last-modified "' el formato es *** 2013-10-23 @ 17: 23: 00 UTC ***, ¿es posible? –

3

Algunas personas han señalado que 'ToUniversalTime' es un tanto peligroso, ya que puede causar dispalys hora incorrecta no deseados Ampliando que estoy proporcionando un ejemplo más detallado de una solución. El ejemplo aquí crea una extensión para el objeto DateTime que devuelve de manera segura un UTC DateTime donde puede usar ToString como lo desee ....

class Program 
{ 
    static void Main(string[] args) 
    { 
     DateTime dUtc = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Utc); 
     DateTime dUnspecified = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Unspecified); 

     //Sample of an unintended mangle: 
     //Prints "2016-06-01 10:17:00Z" 
     Console.WriteLine(dUnspecified.ToUniversalTime().ToString("u")); 

     //Prints "2016 - 06 - 01 03:17:00Z" 
     Console.WriteLine(dUtc.SafeUniversal().ToString("u")); 

     //Prints "2016 - 06 - 01 03:17:00Z" 
     Console.WriteLine(dUnspecified.SafeUniversal().ToString("u")); 
    } 
} 

public static class ConvertExtensions 
{ 
    public static DateTime SafeUniversal(this DateTime inTime) 
    { 
     return (DateTimeKind.Unspecified == inTime.Kind) 
      ? new DateTime(inTime.Ticks, DateTimeKind.Utc) 
      : inTime.ToUniversalTime(); 
    } 
} 
1
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow) 

vuelve 2017-02-10T08: 12: 39.483Z

0

Este código está trabajando para mí:

var datetime = new DateTime(2017, 10, 27, 14, 45, 53, 175, DateTimeKind.Local); 
var text = datetime.ToString("o"); 
Console.WriteLine(text); 
-- 2017-10-27T14:45:53.1750000+03:00 

// datetime from string 
var newDate = DateTime.ParseExact(text, "o", null); 
Cuestiones relacionadas