2009-01-13 57 views
38

Bất kể múi giờ địa phương của người dùng được đặt là gì, sử dụng C# (.NET 2.0) tôi cần xác định thời gian (đối tượng DateTime) trong múi giờ phía đông.Nhận ngày giờ cho múi giờ khác Bất kể múi giờ địa phương

tôi biết về các phương pháp này nhưng có vẻ không phải là một cách rõ ràng để có được một đối tượng DateTime cho một múi giờ khác nhau hơn so với những gì người dùng đang ở.

DateTime.Now 
DateTime.UtcNow 
TimeZone.CurrentTimeZone 

Tất nhiên, nhu cầu giải pháp để có thời gian tiết kiệm ánh sáng ban ngày.

+0

Xin xem http://stackoverflow.com/questions/27415652/get-eastern-time-in-c-sharp-without-converting-local-time – Jay

Trả lời

8

Như mọi người khác đã đề cập, .NET 2 không chứa bất kỳ thông tin múi giờ nào. Các thông tin được lưu trữ trong registry, tuy nhiên, và nó khá tầm thường để viết một lớp bao bọc xung quanh nó:

SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ múi giờ

chứa sub-key cho tất cả các múi giờ . Giá trị trường TZI chứa tất cả các thuộc tính chuyển tiếp và thiên vị cho một múi giờ, nhưng tất cả đều được nhồi trong một mảng nhị phân.Các bit quan trọng nhất (thiên vị và giờ mùa hè), là int32s bảo quản ở vị trí 0 và 8 lần lượt là:

int bias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 0); 
int daylightBias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 8); 

Trang này có một bản tóm tắt lý: http://burks.brighton.ac.uk/burks/language/pascal/uddf/pages/registry.htm

+0

Liên kết bị hỏng ... –

+0

Liên kết Archive.org: https://web.archive.org/web/20090807133141/http: //burks.brighton.ac.uk/burks/language/pascal/uddf/pages/registry.htm – orev

1

Làm thế nào về

DateTime lclTime = DateTime.Now; 
DateTime ept = lclTime.ToUniversalTime().AddHours(
        IsEasternDaylightSavingTime(
         lclTime.ToUniversalTime())? -5: -4) 

hoặc nếu bạn đã có UTC địa phương, chỉ

DateTime lclUtc = DateTime.UtcNow; 
DateTime ept = lclUtc.AddHours(
        IsEasternDaylightSavingTime(lclUtc)? -5: -4) 

Sử dụng từ điển tĩnh của giá trị được mã hóa cứng cho mùa xuân-forward và rơi trở lại tru để kiểm tra thời gian Đông cho tới 50 năm .. Đó chỉ là 300 byte hoặc hơn ... và sau đó chỉ mục vào đó để xác định xem đó là ánh sáng ban ngày tiết kiệm thời gian trên bờ biển phía đông ... Như đã chỉ ra, bạn không quan tâm cho dù đó là dST trong khu vực địa phương hay không .. .

private static bool IsEasternDaylightSavingTime(DateTime utcDateTime) 
    { 
     // hard coded method to determine 
     // whether utc datetime is Eastern Standard time 
     // or Eastern Daylight Time 
    } 
+0

gì nếu vị trí của bạn không sử dụng DST? Sau đó IsDaylightSavingTime sẽ trả về false. –

+0

UTC sẽ không bị ảnh hưởng bởi DST; chắc chắn đó là DST của phương Đông chúng ta cần phải biết, chứ không phải người dân địa phương. –

+0

Có tôi ... Tôi không biết liệu bạn có thể tạo đối tượng múi giờ cho múi giờ khác mà máy tính được đặt thành. Và bạn sẽ có một ocreate một đối tượng timezone fpr Eastern time để xác định cho dù đó là DST hay không ... –

78

Trong .NET 3.5, có TimeZoneInfo, cung cấp nhiều chức năng trong lĩnh vực này; 2.0SP1 có DateTimeOffset, nhưng điều này còn hạn chế hơn nhiều.

Bắt UtcNow và thêm chênh lệch cố định là một phần của công việc, nhưng không phải là DST.

Vì vậy, trong 3,5 tôi nghĩ bạn có thể làm điều gì đó như:

DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
    DateTime.UtcNow, "Eastern Standard Time"); 

Nhưng điều này chỉ đơn giản là không tồn tại trong 2,0; lấy làm tiếc.

+3

Mặc dù anh ta không nằm trong giới hạn của OP, anh ta trả lời câu hỏi của tôi, vì vậy tôi modded this :) – Chris

+3

Cảm ơn ! Tôi chỉ muốn thêm điều này: 'ReadOnlyCollection tz = TimeZoneInfo.GetSystemTimeZones(); Ngày giờ miền đông = TimeZoneInfo.ConvertTimeBySystemTimeZoneId (DateTime.UtcNow, tz [0] .Id); ' –

6

Từ - http://msdn.microsoft.com/en-us/library/system.timezoneinfo.converttimefromutc.aspx

Điều này cho phép một múi giờ được tìm thấy theo tên, trong trường hợp Mỹ từng nổi 15 độ về phía tây hoặc đông từ kinh tuyến London.

DateTime timeUtc = DateTime.UtcNow; 
try 
{ 
    TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); 
    DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone); 
    Console.WriteLine("The date and time are {0} {1}.", 
        cstTime, 
        cstZone.IsDaylightSavingTime(cstTime) ? 
          cstZone.DaylightName : cstZone.StandardName); 
} 
catch (TimeZoneNotFoundException) 
{ 
    Console.WriteLine("The registry does not define the Central Standard Time zone."); 
}       
catch (InvalidTimeZoneException) 
{ 
    Console.WriteLine("Registry data on the Central STandard Time zone has been corrupted."); 
} 
2

Tôi sẽ tiết kiệm thời gian và cho bạn biết rằng không có cách nào trong .net thích hợp, phiên bản 2.0 để nhận đối tượng DateTime cho múi giờ khác với múi giờ đang chạy (khác so với UTC).

Tuy nhiên, điều đó không có nghĩa là không có cách nào để làm điều đó bên ngoài .net. Hãy xem here tại lớp TimeZoneInformation. Lớp này kết thúc tốt đẹp một số p/gọi công cụ đến Win O/S để lấy thông tin múi giờ từ O/S. Tôi đã sử dụng thành công nó khi 2.0 mới và nó hoạt động rất tốt. Trang web tôi đang làm việc phải có khả năng hiển thị mọi ngày/giờ địa phương cho người dùng và phải được DST biết, và lớp này đã điền đầy hóa đơn cho chúng tôi.

0

Một so sánh ngày là một so sánh ngày. DateTime chỉ bao bọc cấu trúc bộ nhớ được xác định trong các dấu tích và làm cho các phương thức truy cập các phần thường được sử dụng của bộ nhớ, ví dụ: ngày hoặc năm hoặc Time hoặc TimeOfDay, vv

Hơn nữa chuyển đổi chỉ có thể nếu bạn biết cả hai offsets nguồn đích snd và sau đó tính toán luôn luôn là như đưa ra được cho bởi -1 * (sourceOffset - destOffset)

Trong trường hợp một phần trong ngoặc đơn đại diện cho chênh lệch múi giờ.

Hãy cũng thấy

Get eastern time in c# without converting local time

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