2012-06-05 17 views
6

Cuando convierto un valor datetimeoffset a un valor datetime, ¿hay alguna posibilidad de pérdida de datos? De documentación de MSDN, la conversión de datetimeoffset de fecha y hora se menciona como sigue:Conversión de DateTimeOffset a DateTime - pérdida de datos

La propiedad DateTime se usa más comúnmente para realizar DateTimeOffset a la conversión DateTime. Sin embargo, devuelve un valor de DateTime cuya propiedad Kind no está especificada. Esto significa que cualquier información sobre la relación del valor DateTimeOffset con UTC se pierde con la conversión cuando se usa la propiedad DateTime.

Para indicar que un valor DateTime convertido es la hora UTC, puede recuperar el valor de la propiedad DateTimeOffset.UtcDateTime. Difiere de la propiedad DateTime de dos maneras:

Devuelve un valor de DateTime cuya propiedad Kind es Utc. Si el valor de la propiedad Offset no es igual a TimeSpan.Zero, convierte la hora en UTC.

veo el siguiente método para convertir fecha y hora a compensar a fecha y hora:

static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime) 
{ 
    if (dateTime.Offset.Equals(TimeSpan.Zero)) 
     return dateTime.UtcDateTime; 
    else if (dateTime.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(dateTime.DateTime))) 
     return DateTime.SpecifyKind(dateTime.DateTime, DateTimeKind.Local); 
    else 
     return dateTime.DateTime; 
} 

Ahora en nuestro sistema que están convirtiendo a datetimeoffset de fecha y hora en la forma anterior. Más tarde queremos convertir el datetime a datetimeoffset.

A modo de ejemplo:

DateTime dt = ConvertFromDateTimeOffset(datetimeOffset); 
DateTimeOffset dofsetnew = new DateTimeOffset(dt); 

Mi pregunta es si en cualquier circunstancia y DateTimeOffset dofsetnew ser diferentes? De ser así, la conversión sería información de pérdida.

Respuesta

4

La forma en que está escrito: sí, siempre que la entrada DateTimeOffset esté en un desplazamiento UTC que tenga cualquier valor distinto de 0 y su zona horaria local (esa última condición 'else'). En mi humilde opinión, es mejor que siempre utilices UtcDateTime, suponiendo que la posible conversión de zona horaria involucrada allí sea aceptable.

Además, si su zona horaria local observa DST, entonces hay pérdidas durante la hora ambigua de cada año, ya que no sabrá a cuál de ellas representa.

Si necesita asegurarse de que no haya pérdidas, no convierta a DateTime y quédese con DateTimeOffset (tipo de servidor sql 'datetimeoffset') o, si debe, mantenga el desplazamiento UTC como un valor separado que transfiere junto con para que pueda reconstruir el DateTimeOffset con los 2 valores (DateTime y offset).

Cuestiones relacionadas