c ++ Как найти время в чужой стране с учетом перехода на летнее время? - PullRequest
10 голосов
/ 30 ноября 2011

Скажем, если это 13:00 в Нью-Йорке (EST), то это 06:00 в Новой Зеландии (NZST).Если в Новой Зеландии будет летнее время, то в 13:00 в Нью-Йорке (все еще EST) будет в 07:00 в Новой Зеландии (сейчас NZDT).

Я прочитал библиотеку времени повышенияно мне кажется, что нужно самостоятельно определить правила перехода на летнее время, чтобы узнать время в другой стране с точки зрения местного времени.

например

 nyc_string = "EST-05:00:00EDT+01:00:00,M4.1.0/02:00:00,M10.5.0/02:00:00";
 // above basically defines the daylight saving rule
 time_zone_ptr nyc_2(new posix_time_zone(nyc_string));

 std::cout << "The second zone is in daylight savings from:\n " 
  << nyc_2->dst_local_start_time(2004) << " through "
  << nyc_2->dst_local_end_time(2004) << std::endl;

источник: http://www.boost.org/doc/libs/1_39_0/doc/html/date_time/examples.html

Может быть, есть кое-что, о чем я еще не знаю?Использует ли boost какую-либо базу данных, которая отслеживает правила перехода на летнее время?Интересно, есть ли хороший способ настроить местное время на другой часовой пояс в c ++ с учетом правил перехода на летнее время? Если бы у меня был пример, это было бы так здорово!

1 Ответ

8 голосов
/ 30 ноября 2011

Boost.DateTime имеет базу данных часовых поясов с именем date_time_zonespec.csv, расположенную в libs/date_time/data.Пример Flight Time в документации показывает, как получить к нему доступ и использовать его.Эта база данных не содержит историю изменений часовых поясов.Также, похоже, нет места для размещения обновлений этой базы данных (кроме самой библиотеки Boost).

Если вам нужны точные, актуальные данные о часовых поясах, ознакомьтесь с Классы часовых поясов ICU популярной библиотеки ICU от IBM.Как упоминалось в разделе Обновление данных о часовых поясах :

Данные о часовых поясах в ICU генерируются из стандартной в отрасли базы данных TZ с использованием кода tzcode (http://source.icu -project.org / repos / icu / icu / trunk / source / tools / tzcode / ).Файлы данных ICU с последними данными о часовых поясах можно загрузить с URL-адреса обновления http://source.icu -project.org / repos / icu / data / trunk / tzdata / icunew .

База данных часового пояса ICU получена из базы данных tz , которая теперь поддерживается ICANN .

Чтобы загрузить файл через http в программе на C ++, вы можете использовать libcurl или оболочка cURLpp C ++.Может быть проще настроить планировщик на вашей ОС для регулярной загрузки последней базы данных.

Как уже упоминалось в комментариях, используйте UTC последовательно для хранения и бизнес-логики.Конвертировать только в / из местного времени для отображения / ввода.

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