Конвертировать чье-то местное время в UTC
Я немного потерян в часовом поясе:)
У меня есть данные, хранящиеся со временем в UTC. Сервер находится в Нидерландах, поэтому мы живем в utc+1 (сейчас, с переходом на летнее время, в utc + 2)
Теперь клиент говорит: дайте мне данные с 5 августа.
Так что я должен рассчитать время utc из "его времени". Для этого я должен знать:
каково ваше смещение utc (мы сохранили это в его профиле, скажем, utc -6) вы в летнее время (потому что тогда мы должны добавить +1 и сделать смещение utc -5)
Тогда мои вопросы:
Могу ли я спросить.Net Framework: есть ли в стране XX летнее время?
Могу ли я спросить.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 ответа
Вы не можете спросить структуру о конкретной стране - но вы можете спросить о конкретном часовом поясе.
TimeZoneInfo
действительно принимает во внимание DST. (Черт, это не будет иметь IsDaylightSavingTime
метод в противном случае.) Если у вас есть два пользователя, один из которых в настоящее время наблюдает летнее время, а другой нет, то они не находятся в одном часовом поясе.
Если бы вы могли указать, о каких местах вы говорите, я мог бы попытаться выяснить, какие часовые пояса задействованы. (Как правило, легче узнать имена Олсона, но не должно быть невозможным узнать идентификаторы Windows.)
Класс TimeZone имеет метод IsDaylightSavingTime, который принимает дату в качестве параметра и возвращает логическое значение, указывающее, входит ли эта дата в летнее время для этого часового пояса.
Я продвигаю свой комментарий к ответу. Похоже, это сложная проблема. Посмотрите на http://www.timeanddate.com/time/dst2010.html, есть таблица DST в разных странах мира. Вы не можете получить это со статическим кодом, потому что летнее время меняется не только от страны к стране, но и из года в год.
Я предполагаю, что вы должны вести таблицу с информацией о DST и получать информацию из нее.
Или вы можете запросить веб-сервис, чтобы получить такую информацию.
Посмотрите на http://www.earthtools.org/webservices.htm сервис, который вы можете запросить, чтобы получить время в другой стране, учитывающей летнее время (он работает только для часовых поясов Западной Европы). Также посмотрите на http://www.geonames.org/export/web-services.html. Вы должны получить геолокацию ваших пользователей, чтобы использовать эти услуги.