2012-06-05 28 views
6

Khi tôi chuyển đổi giá trị datetimeoffset thành giá trị ngày giờ, có khả năng mất dữ liệu hay không. Từ tài liệu MSDN, việc chuyển đổi từ DateTimeOffset để datetime được đề cập như sau:DateTimeOffset để chuyển đổi DateTime - Mất dữ liệu

Thuộc tính DateTime thường được sử dụng để thực hiện DateTimeOffset để chuyển đổi DateTime. Tuy nhiên, nó trả về giá trị DateTime có thuộc tính Loại Loại không xác định. Điều này có nghĩa rằng bất kỳ thông tin nào về mối quan hệ giá trị của DateTimeOffset với UTC bị mất bởi chuyển đổi khi thuộc tính DateTime được sử dụng.

Để cho biết giá trị ngày giờ được chuyển đổi là thời gian UTC, bạn có thể truy xuất giá trị của thuộc tính DateTimeOffset.UtcDateTime. Nó khác với thuộc tính DateTime theo hai cách:

Nó trả về giá trị ngày giờ có thuộc tính Kind là Utc. Nếu giá trị thuộc tính Offset không bằng TimeSpan.Zero, nó chuyển đổi thời gian thành UTC.

tôi thấy các phương pháp sau đây để chuyển đổi datetime bù đắp để 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; 
} 

Bây giờ trong hệ thống của chúng tôi, chúng tôi đang chuyển đổi DateTimeOffset để datetime trong cách trên. Sau đó, chúng tôi muốn chuyển đổi datetime trở lại datetimeoffset.

Như một ví dụ:

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

Câu hỏi của tôi là liệu trong mọi trường hợp DateTimeOffset và dofsetnew thể khác nhau? Nếu vậy thì chuyển đổi sẽ là dữ liệu bị mất.

Trả lời

4

Cách viết - Có, bất kỳ lúc nào DateTimeOffset đầu vào ở mức UTC là bất kỳ giá trị nào khác 0 và múi giờ địa phương của bạn (điều kiện 'khác' cuối cùng). IMHO, bạn nên sử dụng UtcDateTime tốt hơn, giả định rằng việc chuyển đổi múi giờ tiềm năng có liên quan là có thể chấp nhận được.

Ngoài ra, nếu múi giờ địa phương của bạn quan sát DST, thì sẽ mất mát trong giờ không rõ ràng mỗi năm, vì bạn sẽ không biết một trong số đó đại diện cho nó.

Nếu bạn cần đảm bảo không bị mất, hoặc không chuyển đổi thành DateTime và ở lại với DateTimeOffset (loại máy chủ sql 'datetimeoffset') hoặc nếu bạn phải, hãy giữ giá trị UTC dưới dạng giá trị riêng biệt mà bạn chuyển nó, vì vậy bạn có thể tái tạo lại DateTimeOffset với 2 giá trị (DateTime và offset).

Các vấn đề liên quan