zona timezoneinfo horaria example convert cambiar c# datetime xml-serialization timezone

c# - timezoneinfo - Impedir la conversión de la zona horaria en la deserialización del valor de DateTime



timezoneinfo c# (4)

Tengo una clase que serializo / deserializo usando XmlSerializer . Esta clase contiene un campo DateTime .

Cuando se serializa, el campo DateTime está representado por una cadena que incluye el desplazamiento de GMT, por ejemplo, 2010-05-05T09:13:45-05:00 . Cuando se deserializa, estos tiempos se convierten a la hora local de la máquina que realiza la deserialización.

Por razones que no vale la pena explicar, me gustaría evitar que ocurra esta conversión de zona horaria. La serialización ocurre en la naturaleza, donde existen múltiples versiones de esta clase. La deserialización ocurre en un servidor que está bajo mi control. Como tal, parece que esto se manejaría mejor durante la deserialización.

¿Cómo puedo hacer que esto suceda, aparte de implementar IXmlSerializable y hacer toda la deserialización "a mano"?


En lugar de analizar como DateTime , puede analizarlo como DateTimeOffset y usar la propiedad DateTimeOffset.DateTime para ignorar la zona horaria. Me gusta esto:

[XmlIgnore()] public DateTime Time { get; set; } [XmlElement(ElementName = "Time")] public string XmlTime { get { return XmlConvert.ToString(Time, XmlDateTimeSerializationMode.RoundtripKind); } set { Time = DateTimeOffset.Parse(value).DateTime; } }


Lo que hice fue usar el método DateTime.SpecifyKind, como sigue:

DateTime dateTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);

Y esto resuelve mi problema, espero que esto te ayude.


Podría intentar algo como this sugiere this publicación y crear una nueva propiedad de cadena y XmlIgnore la existente:

Ponga [XmlIgnore] en la propiedad Time.

A continuación, agregue una nueva propiedad:

[XmlElement(DataType="string",ElementName="Time")] public String TimeString { get { return this.timeField.ToString("yyyy-MM-dd"); } set { this.timeField = DateTime.ParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture); } }


Sé que esto es viejo pero espero que esto ayude a alguien en el futuro.

Aquí está el XML que estaba deserializando:

<timePeriod>1982-03-31T00:00:00+11:00</t

Después de deserializar el XML, termino con el 30, no el 31:

Aparece la tercera parte que produce este XML (que estoy usando) cambia el TimeZone a +11 durante el horario de verano y lo mantiene como +10 cuando no está en horario de verano (DST).

Según Jon Skeet, UTC no debería considerar el horario de verano: https://.com/a/5495816/495455

También tenga en cuenta la documentación sobre las mejores prácticas de codificación utilizando DateTime en .NET Framework :

El serializador XML siempre asume que los valores de DateTime que se serializan representan la hora local de la máquina, por lo que aplica el desplazamiento de la zona horaria local de la máquina como la parte de compensación de la hora XML codificada. Cuando deserializamos esto en otra máquina, el desplazamiento original se resta del valor que se está analizando y se agrega el desplazamiento de zona horaria de la máquina actual.

El siguiente código me permitió obtener la fecha con formato 31, pero no funcionará al 100% para las fechas de guardado que no sean de Daylioght (que figuran en este feed):

TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time"); DateTime easternTimeNow = TimeZoneInfo.ConvertTimeFromUtc(dataPoint.timePeriod, easternZone); System.Diagnostics.Debug.WriteLine(easternTimeNow.ToString());

Por lo tanto, la solución es arreglar el feed XML para que no alterne UTC con DST.

EDITAR: por qué los datos fueron arruinados

Resulta que NO es el proveedor externo que cambia el UTC con el DST. La fuente XML es creada por el framework Java Swing leyendo un dB de SQL. Normalmente recomendaría mantener la representación estándar de XML (xsd: dateTime) - IS0 8601, pero en este caso usar una cadena y copiar todo después de que la T funcione. Descargo de responsabilidad, todavía estoy tratando de cambiar la fuente, le recomiendo que NO haga esto en PROD. ¡¡Úselo bajo su propio riesgo!!