2009-06-08 70 views
10

Tôi cần có một chức năng chung để chuyển đổi thời gian UTC thành EDT. Tôi có một máy chủ ở Ấn Độ. Một ứng dụng trong nó cần phải sử dụng thời gian EDT cho tất cả các mục đích thời gian.Làm thế nào để chuyển đổi thời gian giữa các múi giờ (UTC thành EDT)?

Tôi đang sử dụng .NET 3.5.

Tôi tìm thấy điều này trên một số diễn đàn khác.

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

Khi tôi thử với "Thời gian ban ngày đông" tôi gặp lỗi.

"ID múi giờ" Giờ ban ngày miền đông 'không được tìm thấy trên máy tính cục bộ ".

Vui lòng trợ giúp giải pháp này hoặc bất kỳ giải pháp nào khác.

Trả lời

22

Giờ ban ngày miền đông không phải là tên của múi giờ "đầy đủ" - đó là "một nửa" múi giờ, có hiệu quả, luôn luôn là 4 giờ sau UTC. (Có thể có thuật ngữ thích hợp cho việc này, nhưng tôi không biết về điều đó.)

Tại sao bạn muốn sử dụng EDT cho những lần không áp dụng tiết kiệm ánh sáng ban ngày? Nếu bạn muốn múi giờ tùy chỉnh luôn có cùng độ lệch với UTC, hãy sử dụng TimeZoneInfo.CreateCustomTimeZone.

Lưu ý rằng nếu bạn sử dụng được múi giờ chuẩn miền Đông (TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")) thì vẫn sẽ có thời gian tiết kiệm ánh sáng ban ngày được áp dụng phù hợp (ví dụ: trong mùa hè).

Ví dụ:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

// Prints True 
Console.WriteLine(tzi.IsDaylightSavingTime(new DateTime(2009, 6, 1))); 
// Prints False 
Console.WriteLine(tzi.IsDaylightSavingTime(new DateTime(2009, 1, 1))); 
+0

Xin chào Jon, Cảm ơn bạn đã trả lời. Những gì bạn sẽ đề nghị là giải pháp tốt nhất trong số 2? tôi sẽ tạo một múi giờ tùy chỉnh hay sử dụng TimeZoneInfo.FindSystemTimeZoneById ("Giờ chuẩn miền Đông"); xem xét rằng nó sẽ chăm sóc tiết kiệm ánh sáng ban ngày. Và làm thế nào để tôi xử lý vấn đề này trong các thủ tục lưu sẵn đang sử dụng phương thức getdate() và dùng thời gian IST? – Shetty

+0

Tôi không biết về các thủ tục được lưu trữ, phải trung thực - nếu có thể, chuyển UTC vào chúng và làm cho chúng hiểu UTC. Đối với việc bạn có nên sử dụng múi giờ tùy chỉnh của Giờ chuẩn miền Đông hay không, tùy thuộc vào việc bạn muốn múi giờ * luôn luôn * 4 giờ sau giờ UTC hay múi giờ phù hợp với Giờ chuẩn miền Đông. Ban đầu bạn đã nói rằng bạn cần sử dụng EDT "cho tất cả các mục đích thời gian" - Tôi khuyên bạn nên kiểm tra xem bạn có * thực sự * cần EDT hay không hoặc bạn có cần Giờ chuẩn miền Đông hay không. –

+0

Ok Jon. Tôi được yêu cầu sử dụng thời gian thành phố * Boston * làm thời gian tiêu chuẩn cho tất cả các mục đích thời gian, nằm dưới EDT. Tôi không biết nhiều về tiết kiệm ánh sáng ban ngày. Tôi muốn ứng dụng của mình thực hiện lần này mặc dù nó đang chạy trên máy chủ IST. Trước đây nó đã được trong một máy chủ khác nhau đang chạy trong múi giờ EDT và tôi đã không có vấn đề như vậy. – Shetty

1

Tôi sẽ nói rằng bạn nên sử dụng UTC để tính toán các khoảng thời gian, do đó bạn tránh được các vấn đề về ước giờ mùa hè và sau đó sử dụng localtime chỉ hiển thị.

DateTime.ToLocalTime cho UTC theo bất kỳ múi giờ địa phương nào và sau đó DateTime.ToUniversalTime để chuyển đổi từ giờ địa phương thành UTC.

Chỉnh sửa sau khi bình luận 1

Tôi mang nó sau đó bạn sau khi hiển thị một múi giờ khác nhau để mà các máy chủ?

Nếu bạn đang sử dụng trang web để truy cập vào máy chủ của mình, hãy sử dụng HttpRequest.UserLanguages ​​để giúp tạo đối tượng CultureInfo và sử dụng đối tượng đó để phân tích cú pháp đối tượng DateTime của bạn. Nhìn vào đây để được giải thích đầy đủ: Microsoft link on displaying local user time for web pages.

Nếu bạn đang sử dụng kiến ​​trúc máy chủ khách, khi đó cuộc gọi LocalTime ở phía máy khách sẽ hiển thị LocalTime cho máy khách. Sau đó bạn chuyển nó sang UTC để gửi lại cho máy chủ của bạn.

Dù bằng cách nào, máy chủ của bạn không cần biết máy khách ở đâu nếu bạn có nhiều khách hàng trong nhiều múi giờ thì tất cả các phép tính sẽ khớp nhau. Nó cũng sẽ cho phép bạn hiển thị thời gian trong bất kỳ múi giờ nào bạn muốn bằng cách sử dụng các đối tượng văn hóa khác nhau.

Chỉnh sửa 2 sao chép bình luận thứ hai của tôi

Bạn có thể lấy dữ liệu thời gian ở định dạng UTC từ máy chủ. Sau đó, bạn có thể chuyển đổi nó bằng DateTime.ToLocalTime hoặc DateTime.ToUniversalTime được requried. Nếu bạn cũng bao gồm ngày tháng và cần phải đối phó với các định dạng dd/MM/yyyy và định dạng dd/MM/yyyy của Mỹ, bạn có thể sử dụng lớp CultureInfo để phân tích giá trị DateTime tương ứng. Nghe có vẻ như nhiều công việc hơn những gì bạn có vào lúc này, nhưng nó có nghĩa là nếu bạn di chuyển máy chủ của bạn một lần nữa thì bạn không cần phải xử lý lại xử lý DateTime.

Một điểm mới

Một điểm cần xem xét là đồng bộ hóa đồng hồ giữa máy chủ và các khách hàng sử dụng NTP (Network Time Protocol) hoặc SNTP (Simple Network Time Protocol) nếu nó là đủ chính xác. Tôi không biết bạn đang sử dụng hệ điều hành nào nhưng điều này được dịch vụ thời gian Windows Server sử dụng để đồng bộ hóa mạng.

+0

Hi Chris, Cảm ơn câu trả lời của bạn. Nếu tôi không sai, nếu máy chủ đang chạy trong múi giờ IST, Datetime.ToLoalTime từ UTC sẽ cung cấp thời gian trong IST.không? – Shetty

+0

Đúng. Tôi đã chỉnh sửa câu trả lời của mình. Để giải thích cách LocalTime wrt Client-server code và cũng là con trỏ để hiển thị thời gian cục bộ cho người dùng web. – ChrisBD

+0

Xin chào Chris, Bạn đã hiểu đúng. Tôi đang hiển thị múi giờ khác với múi giờ của máy chủ. Nó là một kiến ​​trúc máy chủ khách hàng.Nhưng tôi không muốn dựa vào thời gian hệ thống khách hàng coz tất cả các lần máy khách hàng có thể không được chính xác giống nhau. nơi như thể nó sử dụng thời gian máy chủ, nó sẽ được thống nhất cho tất cả các khách hàng. – Shetty

0

Phương pháp cao bồi là lấy thời gian UTC, trừ bốn giờ 'giây từ nó (bù trừ múi giờ), định dạng bằng cách sử dụng chức năng định dạng UTC và đánh dấu vào nhãn "EDT" trên đó.

Nếu bạn cần sử dụng Giờ ban ngày và Giờ chuẩn, hãy tạo bảng tra cứu ngày chuyển đổi hoặc sử dụng một số chức năng lịch.

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