Рутина, чтобы проверить, является ли данная дата летним или зимним временем - PullRequest
1 голос
/ 17 июля 2009

Знаете ли вы, существует ли API для этой проверки?

Ответы [ 3 ]

3 голосов
/ 17 июля 2009

GetTimeZoneInformation - это то, что вам нужно.

Вы можете вызвать его и проверить возвращаемое значение, чтобы определить, включено ли летнее время в момент вызова. Он также заполняет структуру, которая содержит правила перехода на летнее и летнее время. Заполнив эту структуру и указав любое время в формате UTC, вы можете относительно легко вычислить, соответствует ли это время переходу на летнее или стандартное время.

0 голосов
/ 02 октября 2013

В MS-Windows для Win7 и Server2008 / R2 доступны некоторые новые (но еще не завершенные) методы. См. KB 2731771. Также см. ICU и Boost :: locale. Подпрограммы Windows (GetTimeZoneInformationForYear) требуют, чтобы вы конвертировали UTC до минимума за год. К счастью, около 1 января часовые пояса не сдвигаются, как мне известно. Вы можете использовать SystemTimeToTzSpecificLocalTime (Ex), чтобы правильно преобразовать местное время в часовой пояс, который отличается от часового пояса локальной системы. Без этих методов вам нужно сканировать реестр, чтобы загрузить правильную информацию о часовом поясе и динамическую информацию, а затем вызвать SystemTimeToTzSpecificLocalTime. Будьте осторожны при использовании таких вещей, как _tzset и localtime, поскольку некоторые системы (например, Windows) предполагают, что многие (в основном неправильные) вещи, такие как использование правил DST США, даже если ваши настройки TZ для Австралии.

Можно подумать, что как в Windows, так и в Linux есть довольно стандартный способ сделать что-то вроде UTCtoLocal (const char * tzName, time_t inTime, struct tm * outTime) с учетом всех динамических / исторических правил DST для часового пояса. дано. tzName должно иметь возможность использовать подходящее имя, например «Центральное стандартное время» или «Америка / Чикаго», в зависимости от того, на какой системе вы работаете. Я бы даже хотел позволить шаг в два вызова, как GetTimeZoneInformation (const char * tzName, TIME_ZONE_INFORMATION * outTZInfo) UTCtoLocal (const TIME_ZONE_INFORMATION * inTZInfo, time_t inTime, struct tm * outTime) Вы знаете, что ОС уже делает это, когда загружает информацию о часовом поясе системы, а библиотеки выполняют локальные / UTC преобразования.

0 голосов
/ 28 июля 2009

Все хорошо, но GetTimeZoneInformation и GetDynamicTimeZoneInformation возвращают только текущие настройки часового пояса. Что, если текущий TZ (т. Е. Там, где живет мой сервер) не является TZ, который я хочу проверить?

Допустим, у меня есть серверное приложение, которое резервирует книги для оформления заказа. Вы можете сказать: «Я хочу проверить это сейчас» или «Мне нужно проверить это в datetime в будущем». Время оформления вводится по местному времени пользователя и перед сохранением преобразуется в UTC. Когда пользователь извлекает свой список проверок, время преобразуется обратно в местное для отображения.

Предположим, что сервер живет в Нью-Йорке и работает в соответствии со стандартными правилами DST после 2007 года для США. Часовой пояс установлен на восток США, и в настоящее время он находится 27.07.2009 в 15:30, поэтому DST включен.

Пользователи в Нью-Йорке вводят местные даты и время. Конвертировать из ET в UTC - не проблема. Они вводят будущую дату - хорошо. Я использую один из двух вышеупомянутых вызовов API и выясняю это.

Однако пользователь в Сиднее хочет зарезервировать заказ. Она просит проверить 13.12.2009 18:25 относительно ее местного часового пояса в Сиднее. Я не могу использовать мою местную информацию о TZ - Сидней и Нью-Йорк не следуют тем же правилам летнего времени. Как мне загрузить текущую информацию Сиднея о TZ и узнать, является ли произвольная дата летним или нет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...