2010-07-29 42 views
5

tôi có một ngày giờ (trong utc) được lưu trong cơ sở dữ liệu và tôi cũng biết bù trừ utc theo định dạng sau.chuyển đổi thời gian utc và bù đắp cho DateTime

-03:00:00 

làm thế nào để chuyển đổi này cho một người DateTime

+1

'12: 12: 12' không giống như bù trừ UTC cho tôi hoặc trường' datetime'. Bạn có thể giải thích về ý nghĩa của từng phần không? – Oded

+2

http://stackoverflow.com/questions/2548235/convert-utc-datetime-to-another-time-zone điều này sẽ giúp bạn –

+0

@Oded nó là giá trị bù trừ. phạm vi của nó là -12: 00: 00 đến 13:00:00 – developer

Trả lời

10

này cách đơn giản nhất để áp dụng một "bù đắp" tới DateTime rằng bạn đã có là để tạo ra một cấu trúc TimeSpan nắm giữ giá trị bù đắp của bạn, và sau đó chỉ cần " thêm "giá trị bù trừ cho giá trị DateTime ban đầu.

Ví dụ:

DateTime utcDateTime = DateTime.Parse("29 July 2010 14:13:45"); 
TimeSpan offSet = TimeSpan.Parse("-03:00:00"); 
DateTime newDateTime = utcDateTime + offSet; 
Console.WriteLine(newDateTime); 

Điều này dẫn đến kết quả như sau:

29/07/2010 11:13:45

đó là thời gian ban đầu (Tháng Bảy 29, 2010 14:13:45) trừ đi 3 giờ (các bù đắp - -03: 00: 00).

Lưu ý rằng kỹ thuật này chỉ đơn thuần là thực hiện số học đơn giản với giá trị DateTime của bạn và không tính đến bất kỳ múi giờ nào.

+2

Lưu ý rằng Parse không thành công khi bạn có dấu '+' trong chuỗi. Vì vậy, sử dụng dấu '-' hoặc không có dấu hiệu nào cả! http://msdn.microsoft.com/en-us/library/se73z7b9%28v=vs.110%29.aspx – Jowen

+0

Còn tiết kiệm ánh sáng ban ngày thì sao? –

+0

@AnilPurswani Bạn chỉ có thể áp dụng bù trừ tiết kiệm ánh sáng ban ngày nếu bạn biết múi giờ cụ thể thay vì chỉ là "bù giờ". Lớp TimeZoneInfo có thuộc tính (SupportsDaylightSavingTime) để cho biết múi giờ cụ thể có hỗ trợ tiết kiệm ánh sáng ban ngày hay không. Các múi giờ khác nhau có thể có cùng thời gian bù trừ nhưng có thể hoặc không thể hỗ trợ tiết kiệm ánh sáng ban ngày. – CraigTP

0

Sự cố bạn gặp phải là hầu hết trình điều khiển DB khi tìm nạp từ cơ sở dữ liệu sẽ tạo DateTime với DateTimeKind.Unspecified, có thể không chuyển đổi thành UTC đúng ngay cả khi bạn sử dụng ToUniversalTime. Để có được điều này, tôi sử dụng một phương pháp mở rộng như sau:

public static DateTime ToSafeUniversalTime(this DateTime date) { 
     if(date != DateTime.MinValue && date != DateTime.MaxValue) { 
      switch(date.Kind) { 
      case DateTimeKind.Unspecified: 
       date = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, DateTimeKind.Utc); 
       break; 
      case DateTimeKind.Local: 
       date = date.ToUniversalTime(); 
       break; 
      } 
     } 
     return date; 
    } 
Các vấn đề liên quan