2010-08-05 44 views
8

Tôi bị mất một chút trong múi giờ :)Chuyển đổi giờ địa phương của ai đó thành giờ UTC

Tôi có dữ liệu được lưu trữ bằng thời gian ở UTC. Máy chủ ở Hà Lan, vì vậy chúng tôi sống ở utc + 1 (hiện tại, với daylightsavingtime, trong utc + 2)

Bây giờ khách hàng nói: hãy cho tôi dữ liệu từ ngày 5 tháng 8.

Vì vậy, tôi phải tính thời gian utc từ 'thời gian của anh ấy'. Đối với điều đó tôi phải biết:

chênh lệch utc của bạn là gì (chúng tôi lưu trữ trong hồ sơ của anh ấy, giả sử utc -6) là bạn đang ở chế độ daylightsavingtime (vì vậy chúng tôi phải thêm +1 và thực hiện bù trừ -5)

Sau đó, câu hỏi của tôi:

  1. tôi có thể yêu cầu .Net framework: không nước XX có daylightsavingtime?

  2. Tôi có thể hỏi khung .Net: 08-05-2010T00: 00: 00 ở quốc gia XXX daylightsavingtime tại thời điểm đó?

Tôi đã thử .ToLocalTime(), nhưng điều này chỉ cho tôi thời gian cục bộ tại máy chủ và đó không phải là điều tôi muốn, tôi muốn tính toán múi giờ của người dùng và với thực tế là ở đó điểm cụ thể trong thời gian, nếu anh/cô ấy là trong daylightsavingtime

tôi cũng đã nhìn thấy ví dụ VB này:

TimeZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time") 
Dim Dated As DateTime = TimeZoneInfo.ConvertTimeToUtc(TempDate, TimeZone) 

nhưng IMHO này không đưa vào tài khoản mà người dùng trong múi giờ này là hoặc không ở trong một quốc gia daylightsavingtime (dst). Ví dụ: , một người dùng trong múi giờ này ở hà lan có dst và một người khác ở một quốc gia khác không có dst.

+1

Câu hỏi liên quan - http://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – Oded

+0

Tài nguyên tuyệt vời! – Michel

Trả lời

6

Bạn không thể yêu cầu khung về một quốc gia cụ thể - nhưng bạn có thể hỏi về một múi giờ cụ thể.

TimeZoneInfokhông lấy DST vào tài khoản. (Heck, nó sẽ không có phương pháp IsDaylightSavingTime nếu không.) Nếu bạn có hai người dùng, một trong số họ hiện đang quan sát DST và người kia thì không, thì họ không phải là trong cùng một múi giờ .

Nếu bạn có thể chỉ định vị trí bạn đang nói đến, tôi có thể cố gắng tìm hiểu múi giờ nào có liên quan. (Nói chung là dễ dàng hơn để tìm ra tên của Olson, nhưng không nên tìm ra các ID Windows.)

+0

Ok, cảm ơn. Nhưng bạn có nói rằng người dùng phải thay đổi múi giờ của họ khi nhập DST? ví dụ, thông thường tôi đang ở GMT + 1 Amsterdam, nhưng sau đó DST được nhập vào, sau đó tôi vào GMT + 2? Hoặc tôi đang trong GMT + 1 trong DST? Nếu trường hợp cũ, người dùng phải thay đổi múi giờ của mình trong ứng dụng của tôi. (trong trường hợp đó, nó sẽ hoạt động như bạn nói, vì người dùng sống ở quốc gia DST thay đổi múi giờ của mình thành +2 và người dùng sống ở quốc gia không phải DST giữ múi giờ của mình tại +1) – Michel

+0

@Michel: Không, múi giờ mô tả khi nào nó vào và thoát DST. Ví dụ: tôi đang ở múi giờ với tên Olson "Châu Âu/Luân Đôn" - đó là UTC trong nửa năm và UTC + 1 trong nửa năm. Người dùng của bạn ở quốc gia DST * không * thay đổi múi giờ - thay đổi múi giờ của họ được bù trừ từ UTC. Đó là một sự khác biệt rất quan trọng. –

+0

@Jon: ok, không biết rằng TimeZone có kiến ​​thức về thời điểm DST bắt đầu kết thúc. Nhưng: sau đó cũng phải biết bạn sống ở đâu, bởi vì tôi có thể kiểm tra TimeZone nếu vùng của bạn đang ở DST ngay bây giờ, nhưng tôi cũng phải biết nếu quốc gia của bạn (vì có nhiều quốc gia trong múi giờ của bạn) làm việc với DST hay không ? – Michel

2

Lớp TimeZone có một phương thức IsDaylightSavingTime lấy ngày làm tham số và trả về một boolean cho biết rằng ngày trong giờ ban ngày cho múi giờ đó.

+0

Cảm ơn, nhưng điều đó chỉ hoạt động cho thời gian địa phương, trong trường hợp của tôi, trong một ứng dụng máy chủ asp.net, đó sẽ là thời gian của vị trí nơi máy chủ được đặt. trường hợp tôi có thể kiểm tra xem máy chủ có trong dst hay không, nhưng không phải nếu người dùng trong một múi giờ cụ thể. – Michel

2

Tôi quảng cáo nhận xét của mình cho câu trả lời. Nó có vẻ là một vấn đề phức tạp. Nhìn vào http://www.timeanddate.com/time/dst2010.html, có một bảng DST ở nhiều quốc gia khác nhau trên thế giới. Bạn không thể có được điều này với mã tĩnh vì DST không chỉ thay đổi từ quốc gia này sang quốc gia khác, mà còn từ năm này sang năm khác.

Tôi đoán bạn phải duy trì một bảng có thông tin DST và nhận thông tin từ đó.

Hoặc bạn có thể truy vấn dịch vụ web để nhận các thông tin như vậy.

Nhìn vào http://www.earthtools.org/webservices.htm#timezone cho dịch vụ web mà bạn có thể truy vấn để nhận thời gian ở nhiều quốc gia khác nhau trong tài khoản DST (chỉ hoạt động cho múi giờ Tây Âu). Ngoài ra, hãy xem http://www.geonames.org/export/web-services.html. Bạn phải có được vị trí địa lý của người dùng của bạn để sử dụng các dịch vụ này.

+0

Tôi đã tìm thấy điều này: 'timeZone.GetAdjustmentRules() [0] .DaylightTransitionStart' cho tôi biết khi nào dst bắt đầu trong một khu vực cụ thể, là như vậy? – Michel

+0

Tôi tìm trong MSDN. Đó là về giống nhau, nhưng theo thông tin trên http://www.timeanddate.com/time/dst2010.html thông tin DST là một thông tin động, thay đổi theo thời gian theo các sửa đổi luật của các quốc gia, vì vậy nó không thể được "nhúng" vào một khung tĩnh. Dù sao, tôi đoán sửa đổi luật không xảy ra quá thường xuyên, vì vậy nếu bạn không bận tâm về một sai lầm trong tính toán một lần trong một thời gian, bạn có thể đi với DaylightTransitionStart –

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