Конвертировать чье-то местное время в UTC - PullRequest
8 голосов
/ 05 августа 2010

Я немного потерян в часовом поясе:)

У меня есть данные, хранящиеся со временем в UTC.Сервер находится в Нидерландах, поэтому мы живем в utc + 1 (сейчас, с переходом на летнее время, в utc + 2)

Теперь клиент говорит: дайте мне данные 5 августа.

Так что я должен рассчитать время utc из «его времени».Для этого я должен знать:

каково ваше смещение utc (мы сохранили это в его профиле, скажем, utc -6), вы в летнее время (потому что тогда мы должны добавить +1 и сделать смещение utc-5)

Тогда мои вопросы:

  1. Могу ли я задать вопрос .Net Framework: есть ли у страны XX летнее время?

  2. Могу ли я спросить .Net Framework: 08-05-2010T00: 00: 00 в стране XXX летнее время в данный момент?

я пробовал .ToLocalTime (),но это только дает мне местное время на сервере, и это не то, что я хочу, я хочу рассчитать с часовым поясом пользователя, а также с тем фактом, что в этот конкретный момент времени, если он / она находится в летнее время

Я также видел этот пример VB:

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

, но imho это не учитывает, что пользователь в этом часовом поясе находится или не находится в стране перехода на летнее время (dst),Например, один пользователь в этом часовом поясе находится в Нидерландах с dst, а другой - в другой стране, в которой нет dst.

Ответы [ 3 ]

6 голосов
/ 05 августа 2010

Вы не можете спросить структуру о конкретной стране - но вы можете спросить о конкретном часовом поясе .

TimeZoneInfo действительно учитывает DST. (Черт, в противном случае у него не было бы метода IsDaylightSavingTime.) Если у вас есть два пользователя, один из которых в настоящее время наблюдает летнее время, а другой нет, то они не в одном часовом поясе.

Если бы вы могли указать, о каких местах вы говорите, я мог бы попытаться выяснить, какие часовые пояса задействованы. (Как правило, легче узнать имена Олсона, но не может быть невозможным найти идентификаторы Windows.)

2 голосов
/ 05 августа 2010

Я продвигаю свой комментарий к ответу. Похоже, это сложная проблема. Посмотрите на http://www.timeanddate.com/time/dst2010.html,, есть таблица DST в разных странах мира. Вы не можете получить это со статическим кодом, потому что летнее время меняется не только от страны к стране, но и из года в год.

Полагаю, вам нужно вести таблицу с информацией о летнем времени и получать из нее информацию.

Или вы можете запросить веб-сервис для получения такой информации.

Посмотрите на http://www.earthtools.org/webservices.htm#timezone для веб-сервиса, который вы можете запросить, чтобы получить время в разных странах, учитывающих DST (он работает только для часовых поясов Западной Европы). Также посмотрите на http://www.geonames.org/export/web-services.html. Вы должны настроить геолокацию своих пользователей, чтобы использовать эти сервисы.

2 голосов
/ 05 августа 2010

В классе TimeZone есть метод IsDaylightSavingTime, который принимает дату в качестве параметра и возвращает логическое значение, указывающее, входит ли эта дата в летнее время для этого часового пояса.

...