2012-06-05 20 views
6

Quando converto un valore datetimeoffset in un valore datetime, c'è qualche possibilità di perdita di dati. dalla documentazione MSDN, la conversione da datetimeoffset a datetime è menzionato come segue:DateTimeOffset to DateTime conversion - Data Loss

La proprietà DateTime è più comunemente usato per eseguire DateTimeOffset alla conversione DateTime. Tuttavia, restituisce un valore DateTime la cui proprietà Kind non è specificata. Ciò significa che qualsiasi informazione su la relazione del valore DateTimeOffset con UTC viene persa dalla conversione quando viene utilizzata la proprietà DateTime.

Per indicare che un valore di DateTime convertito è l'ora UTC, è possibile recuperare il valore della proprietà DateTimeOffset.UtcDateTime. Si differenzia dalla proprietà DateTime in due modi:

Restituisce un valore DateTime cui proprietà Kind è Utc. Se il valore della proprietà Offset non è uguale a TimeSpan.Zero, converte l'ora in UTC.

vedo il seguente metodo per convertire datetime offset datetime:

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; 
} 

Ora nel nostro sistema stiamo convertendo datetimeoffset in datetime nel modo sopra. In seguito vogliamo convertire il datetime di nuovo in datetimeoffset.

Per fare un esempio:

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

La mia domanda è se in nessun caso datetimeoffset e dofsetnew essere diverso? Se è così allora la conversione sarebbe dati di perdita.

risposta

4

Il modo in cui è scritto: Sì, ogni volta che l'input DateTimeOffset è impostato su un offset UTC diverso da 0 e il fuso orario locale (quest'ultima condizione "else"). IMHO, stai meglio usando sempre UtcDateTime, supponendo che la potenziale conversione del fuso orario coinvolta sia accettabile.

Inoltre, se il fuso orario locale osserva l'ora legale, in quel momento c'è una perdita durante l'ora ambigua ogni anno, dal momento che non si sa quale di questi rappresenta.

Se è necessario assicurarsi che non ci siano perdite, non convertirle in DateTime e rimanere con DateTimeOffset (tipo server sql 'datetimeoffset') o se è necessario, mantenere lo scostamento UTC come valore separato da passare insieme a così, quindi è possibile ricostruire DateTimeOffset con i 2 valori (DateTime e offset).