2013-03-28 20 views
5

Tôi biết chúng tôi có thể thay đổi văn hóa hiện tại cho chuỗi hiện tại. Và tôi biết chúng tôi không thể có được TimeZoneInfo từ CurrentCulturevì một nền văn hóa có thể có nhiều múi giờnhư MỹLàm cách nào để đặt Múi giờ cho mỗi chủ đề?

Tuy nhiên, để sử dụng kỹ thuật tương tự để đối phó với TimeZone cho thread hiện hành.

Nó sẽ rất tốt đẹp nếu chúng ta có thể làm một cái gì đó như thế này:

TimeZone.CurrentTimeZone = TimeZoneInfo.FindSystemTimeZoneById("timezone id"); 
+1

Chúng tôi không phải là một tính năng mong muốn cho trang web .NET, chúng tôi một câu trả lời chắc chắn cho trang câu hỏi rắn. Xử lý múi giờ là không tầm thường ở thời điểm tốt nhất, thêm lớp phức tạp của một múi giờ cho mỗi luồng chỉ yêu cầu sự cố – Petesh

+0

@Petesh Tôi không có ý định hỏi tại sao thực sự. Tôi đã tự hỏi nếu điều đó là có thể trong một số cách. –

+1

Không có gì ngăn cản bạn tạo ra một đối tượng thread-local cho múi giờ, nó chỉ là không có gì ngoại trừ mã của bạn sẽ sử dụng nó. Bạn nên xem ['ThreadLocal ' Class] (http://msdn.microsoft.com/en-us/library/dd642243.aspx) trong .NET cho một cách tầm thường để thực hiện nó. – Petesh

Trả lời

5

Thật không may, bất kỳ khái niệm về múi giờ "hiện tại" được gắn với các thiết lập hệ điều hành của máy mà mã đang chạy. Có một số Win32 apis để thay đổi múi giờ, nhưng tôi không khuyên bạn nên sử dụng chúng. Không chỉ chúng không "an toàn chỉ", nhưng chúng cũng không phải là "quá trình an toàn". Cài đặt múi giờ ảnh hưởng đến mọi thứ đang chạy trên máy.

Điều đó nói rằng, tôi muốn tò mò về trường hợp sử dụng của bạn thực sự là gì. Nếu bạn đang ở vị trí để đặt múi giờ cho mỗi luồng, thì có thể bạn đang ở vị trí không phụ thuộc vào cài đặt cục bộ. Bạn có thể sử dụng các phương pháp chuyển đổi trên TimeZoneInfo để thay thế.

Ví dụ: giả sử bạn đang tìm kiếm thời gian hiện tại ở một múi giờ khác. Bạn có thể tìm kiếm các khả năng để làm điều này:

using (TimeZone.CurrentTimeZone = ... ) 
{ 
    var now = DateTime.Now; 
} 

Nhưng thay vào đó bạn chỉ đơn giản là nên chuyển đổi từ UTC nơi thích hợp:

var now = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
         DateTime.UtcNow, "some other timezone id"); 
+0

Múi giờ được sử dụng ngầm trong một số hàm khác nhau (ví dụ: chuyển đổi từ chuỗi thành ngày giờ bằng cách sử dụng 'AdjustToUniversal'). Chúng có thể được thay đổi một cách thủ công để sử dụng một múi giờ rõ ràng, nhưng nó không dễ dàng trong một cơ sở mã lớn. Trong cùng một cách, bạn có thể xác định rõ ràng văn hóa để sử dụng trong các hàm như 'string.Format()' - nhưng ở đó bạn có cách thay thế để đặt văn bản cho luồng và 'sửa tất cả' trong một lần. – MiMo

+2

Có, nó được sử dụng trong nội bộ bởi nhiều chức năng, nhưng không - bạn không thể thay đổi nó. Không có móc, và tất cả mọi thứ được niêm phong. Người ta sẽ nghĩ rằng nó sẽ hành xử như cultureinfo, nhưng nó không. Nó hoàn toàn khác. Chỉ có một thiết lập múi giờ toàn hệ thống duy nhất. –

+0

Vâng, tôi biết - bình luận trước đây của tôi là một câu trả lời đã cố gắng cho câu hỏi của bạn 'trường hợp sử dụng' sẽ là gì - nếu nó tồn tại. – MiMo

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