2009-04-15 15 views
7

Mi objetivo es usar el objeto .NET DateTime (en C#) y hacer que se serialice y se analice desde una cadena (para usar en XML) de una manera eso es conforme a los estándares. El estándar específico que tengo en mente es el estándar ISO 8601 para representar fechas y horas.Cómo serializar objetos DateTime en .NET de una manera compatible con los estándares

Quiero una solución fácil de usar (preferiblemente, una llamada de método en cada sentido) que se convertirá desde y hacia la versión concatenada del formato. También me gustaría preservar la información de zona horaria local.

He aquí un ejemplo del tipo de cuerda me gustaría llegar:

2009-04-15T10: 55: 03,0174-05: 00

Mi versión de destino .NET es de 3.5.

De hecho, encontré una solución a este problema hace varios años, que implica un formato personalizado y el método DateTime.ToString (cadena). Me sorprendió que no existiera una solución más simple que cumpliera con los estándares. Usar una cadena de formato personalizada para serializar y analizar de una manera compatible con los estándares me huele un poco.

Respuesta

15

Afortunadamente, hay XmlConvert.ToString() y XmlConvert.ToDateTime() que se ocupa de este formato:

string s = XmlConvert.ToString(DateTime.Now, 
    XmlDateTimeSerializationMode.Local); 
DateTime dt = XmlConvert.ToDateTime(s, 
    XmlDateTimeSerializationMode.Local); 

(escoger su serialización en modo apropiado)

+0

viejo-temporizadores se Seguro rápido en el sorteo. :-) –

+1

Temporizadores antiguos !! ?? ;-p resoplido indignado .... En mi día ... –

3

Parece .NET ha mejorado un poco en este sentido durante la última pocos años. El objeto System.Xml.XmlConvert parece estar diseñado para abordar una clase completa de necesidades que aparecen en este contexto. Las siguientes funciones parecen estar diseñadas específicamente para tratar la conversión de objetos DateTime de una manera flexible y conforme a los estándares.

XmlConvert.ToDateTime(string, System.Xml.XmlDateTimeSerializationMode) 


XmlConvert.ToString(DateTime, System.Xml.XmlDateTimeSerializationMode) 

El siguiente miembro de la enumeración parece especialmente útil en el caso de que desea conservar la información de zona de tiempo original:

System.Xml.XmlDateTimeSerializationMode.RoundtripKind 

Aquí se encuentran enlaces a la documentación de las funciones en MSDN:

XmlConvert.ToDateTime(string, System.Xml.XmlDateTimeSerializationMode)

XmlConvert.ToString(DateTime, System.Xml.XmlDateTimeSerializationMode)

1

Prueba esto:

System.Xml.XmlConvert.ToString(TimeStamp, System.Xml.XmlDateTimeSerializationMode.Utc)) 
4

dateobj.ToString ("s") le conseguirá una representación de cadena ISO 8601 compatible, que luego pueden ser deserialized con DateTime.Parse()

Cuestiones relacionadas