2013-05-20 47 views
5

Tôi lên chống lại một vấn đề lưu trữ datetimes như UTC và nhầm lẫn tại sao điều này không mang lại kết quả tương tự khi thay đổi múi giờ:Chuyển đổi Giờ địa phương Để UTC

var dt = DateTime.Parse("1/1/2013"); 
MessageBox.Show(TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local).ToString()); 

Tôi switching thủ công múi giờ địa phương của tôi trên máy giữa đông và trung tâm.

Sản lượng trung bình 1/1/2013 6:00:00 AM và sản lượng phương Đông 1/1/2013 5:00:00 AM. Tôi đang thiếu gì ở đây? Chúng phải giống nhau bất kể múi giờ, đúng không?

Cảm ơn bạn rất nhiều trước!

+4

Vì vậy, bạn đang dành thời gian khởi đầu tương tự, gắn nó vào một múi giờ, các chuyển đổi nó sang UTC, và nhận được lần UTC khác nhau? Có vẻ như nó đang hoạt động. – cadrell0

+0

Tôi nghĩ bạn cần đọc bài đăng trên blog này của Jon Skeet để hiểu đầy đủ các vấn đề về UTC/giờ địa phương: http://noda-time.blogspot.co.uk/2011/08/what-wrong-with-datetime-anyway .html –

+0

Tôi không hiểu tại sao bạn muốn chuyển đổi thành UTC. Làm thế nào về chỉ đơn giản là bắt đầu trong UTC? Có quá tải 'DateTime.Parse' cho phép bạn chỉ định' Loại'. – CodesInChaos

Trả lời

8

Tôi nghĩ rằng những gì bạn đang thiếu là DateTime trả về bởi tuyên bố DateTime.Parse() của bạn không đi kèm với một múi giờ. Đó chỉ là ngày và giờ có thể ở bất kỳ múi giờ nào. Khi bạn gọi TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local), bạn đang nói nó sẽ bắt đầu từ múi giờ nào. Vì vậy, nếu bạn bắt đầu ở miền Trung, bạn sẽ nhận được một câu trả lời, trong khi nếu bạn bắt đầu ở miền Đông, bạn sẽ nhận được câu trả lời sớm hơn một giờ. Thật vậy, đây là những gì mã của bạn cho thấy.

+0

Vì vậy, nếu tôi chạy DateTime.Now.ToUniversalTime() trên Trung nó giống như tôi chạy trên phương Đông. Làm thế nào để tạo một đối tượng datetime mà khi tôi chuyển đổi sang phổ quát, nó là như nhau bất kể múi giờ ??? –

+0

@ user1174729 - khi bạn nói "hiện tại", bạn đang nói về một khoảnh khắc kịp thời. Nếu bạn nói "bây giờ" lúc nửa đêm trong múi giờ của riêng bạn, nó sẽ không phải là nửa đêm khác. Nếu bạn muốn xây dựng một datetime là như nhau bất kể múi giờ, bạn sẽ phải tạo ra nó trong UTC. Có một hàm tạo để bạn có thể truyền 'DateTimeKind.Utc'. –

+0

Vâng, những gì Matt nói. Bí quyết là luôn làm việc với DateTimes có trong UTC và sau đó chuyển đổi chúng thành múi giờ của người dùng khi hiển thị chúng. –

3

Có một phương pháp .ToUtc() cho DateTime lớp

+0

Kết quả tương tự cho: MessageBox.Show (dt.ToUniversalTime(). ToString()); –

+0

Đúng vậy. Btw, cùng một thời gian cho CST và EST thực sự sẽ khác nhau một giờ trong UTC –

1

Đây là nửa đêm

var dt = DateTime.Parse("1/1/2013"); 

Midnight ở miền đông và miền Trung không phải là thời gian tuyệt đối giống nhau.
Đó là toàn bộ mục đích của múi giờ.

+0

Yup, đây là câu trả lời đúng. Nửa đêm trong một múi giờ là 5UTC và nửa đêm ở múi giờ khác là 6UTC. –

0

Bạn có thể sử dụng NodaTime:

static string LocalTimeToUTC(string timeZone, string localDateTime) 
{ 
    var pattern = LocalDateTimePattern.CreateWithInvariantCulture("dd/MM/yyyy HH:mm:ss"); 
    LocalDateTime ldt = pattern.Parse(localDateTime).Value; 
    ZonedDateTime zdt = ldt.InZoneLeniently(DateTimeZoneProviders.Tzdb[timeZone]); 
    Instant instant = zdt.ToInstant(); 
    ZonedDateTime utc = instant.InUtc(); 
    string output = utc.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture); 

    return output; 
} 
Các vấn đề liên quan