2010-10-03 29 views
10

Tôi có một chức năng có thể chuyển đổi theo thời kỷ nguyên unix đến một giá trị NET DateTime:Làm cách nào để chuyển đổi từ thời gian kết hợp unix và tài khoản cho thời gian tiết kiệm ánh sáng ban ngày trong C#?

public static DateTime FromUnixEpochTime(double unixTime) 
{ 
    DateTime d = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    return d.AddSeconds(unixTime); 
} 

Tôi đang ở đâu (Anh) đồng hồ đi một giờ về phía trước cho thời gian mùa hè.

Trong Python, tôi có được thời gian Epoch địa phương bằng cách sử dụng time.time() (và vì lợi ích của đối số, ngay bây giờ là 17:15:00) mang lại cho tôi giá trị 1286122500.

Nếu tôi chuyển đổi điều này trở lại thời gian có thể đọc được bằng cách sử dụng time.localtime(), nó chuyển đổi về 17:15 như tôi mong đợi.

Làm cách nào để chuyển đổi thời gian thời gian unix trở lại thành giá trị .NET DateTime VÀ tài khoản cho thời gian tiết kiệm ánh sáng ban ngày cục bộ. Chức năng của tôi ở trên chuyển đổi 1286122500 trở lại 16:15 không đúng với vị trí địa lý của tôi.

Trả lời

20

Sử dụng DateTime.ToLocalTime():

http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx

public static DateTime FromUnixEpochTime(double unixTime) 
{ 
    DateTime d = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    d = d.AddSeconds(unixTime); 
    return d.ToLocalTime(); 
} 
+0

+1, không có gì phức tạp hơn là cần thiết ở đây. –

+0

Ah ha ... Tôi đã thử 'DateTimeKind.Local' trong hàm tạo DateTime, không thể tin rằng tôi đã bỏ lỡ phương thức' .ToLocalTime() '. – Kev

+0

Cũ nhưng tốt. Cảm ơn. – kmarks2

1

Tiết kiệm ánh sáng ban ngày của bạn sắp kết thúc? Nếu vậy, các tệp múi giờ của bạn có thể lỗi thời, nghĩ rằng nó đã kết thúc. (Tôi không biết về Vương quốc Anh, nhưng ở Mỹ, phạm vi tiết kiệm ánh sáng ban ngày đã được mở rộng cách đây 3 năm và nhiều cài đặt vẫn không có dữ liệu cập nhật.)

Tóm lại, hãy đảm bảo múi giờ của bạn dữ liệu được cập nhật. :-)

+0

Chúng không lỗi thời. Ngoài ra Python được quyền này. – Kev

1

Đó là 17:15 cho 1286122500 trong múi giờ BST (hoặc GMT + 1) (Giờ mùa hè của Anh).

Chức năng của bạn sử dụng DateTimeKind.Utc cho phép sử dụng UTC (aka GMT), vì vậy bạn sẽ có thời gian trong GMT: 16:15. Ngoài ra, tôi không nghĩ rằng việc thay đổi múi giờ của tham chiếu epoch unix sẽ cần thiết ảnh hưởng đến múi giờ địa phương hiện tại của bạn một cách chính xác.

Thay vào đó, bạn có thể thử một cái gì đó như thế này:

DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
DateTime d = unixEpoch + new TimeSpan(unixTime); 

(và sau đó chuyển sang DateTimeKind.Local)

5

Lớp TimeZoneInfo là tuyệt vời lúc h elping một thỏa thuận với thời gian và múi giờ khác nhau. Nó sử dụng thông tin múi giờ mà Windows đã tích hợp để chuyển đổi giữa các múi giờ khác nhau.

Đây là cách bạn muốn sử dụng nó cho vấn đề của bạn:

//Get your unix epoch time into a DateTime object 
DateTime unixTime = 
    new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc).AddSeconds(1286122500); 

//Convert to local time 
DateTime localTime = TimeZoneInfo.ConvertTime(unixTime, TimeZoneInfo.Local); 

TimeZoneInfo.Local trả về TimeZoneInfo đại diện cho múi giờ địa phương.

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