2010-07-29 77 views
6

Tôi có dòng mã này:C# DateTime vấn đề trừ múi giờ

double seconds = new DateTime(2006,7,6,12,1,0,DateTimeKind.Local).Subtract(new DateTime(1970,1,1,0,0,0,DateTimeKind.Local).TotalSeconds; 

Đây không phải là số đúng tôi muốn, vì vậy tôi thử như sau:

double seconds = new DateTime(2006,7,6,12,1,0,DateTimeKind.Local).Subtract(new DateTime(1970,1,1,0,0,0,DateTimeKind.Utc).TotalSeconds; 

(Sự khác biệt là trong một trường hợp, tôi sử dụng thời gian địa phương cho thời đại, và trong trường hợp khác, tôi sử dụng UTC). Điều thú vị là, cả hai đều mang lại cho tôi giá trị như nhau, và tôi không biết tại sao lại như vậy. Tôi sống ở -600 GMT, vì vậy DateTimeKind.Local thực sự sẽ ảnh hưởng đến mọi thứ.

Cảm ơn trước!

Trả lời

5

Trong trang DateTimeKind trên MSDN (http://msdn.microsoft.com/en-us/library/shx7s921.aspx), nó nói:

Các thành viên thuộc kiểu liệt kê DateTimeKind được sử dụng trong các hoạt động chuyển đổi giữa giờ địa phương và phối hợp quốc tế (UTC), nhưng không phải trong so sánh hoặc số học hoạt động . Để biết thêm thông tin về chuyển đổi thời gian, hãy xem Chuyển đổi thời gian giữa các múi giờ.

Lời khuyên có nói sử dụng TimeZoneInfo.ConvertTimeToUtc

Vì vậy, trên cơ sở đó, các mã có lẽ nên được sửa đổi để:

double seconds = new DateTime(2006,7,6,12,1,0,DateTimeKind.Local).Subtract(TimeZoneInfo.ConvertTimeToUtc(new DateTime(1970,1,1,0,0,0,DateTimeKind.Local)).TotalSeconds 
+1

cho các hồ sơ, nó thực sự đã kết thúc như thế này: double seconds = TimeZoneInfo.ConvertTimeToUtc (new DateTime (2006,7,6,12,1,0, DateTimeKind.Local)). Trừ (new DateTime (1970,1,1,0,0, 0, DateTimeKind.Local) .TotalSeconds – codersarepeople

1

Hãy thử điều này:

namespace ConsoleApplication1 
{ 
    using System; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var laterDate = new DateTime(2006, 7, 6, 12, 1, 0); 
      var earlyDate = new DateTime(1970, 1, 1, 0, 0, 0); 
      var diff = laterDate.ToUniversalTime().Subtract(earlyDate.ToUniversalTime()); 
      var seconds = diff.TotalSeconds; 
     } 
    } 
} 
Các vấn đề liên quan