5.4. Преобразование между часовыми поясами

5.4. Преобразование между часовыми поясами

Проблема

Требуется преобразовать текущее время из одного часового пояса в другой.

Решение

Чтобы выполнить преобразование между часовыми поясами, используйте процедуры преобразования часовых поясов из библиотеки Boost date_time. Пример 5.8 показывает, как, зная время в Нью-Йорке, определить время в Туксоне, Аризона.

Пример 5.8. Преобразование между часовыми поясами

#include <iostream>

#include <boost/date_time/gregorian/gregorian.hpp>

#include <boost/date_time/posix_time/posix_time.hpp>

#include <boost/date_time/local_time_adjustor.hpp>

using namespace std;

using namespace boost::gregorian;

using namespace boost::date_time;

using namespace boost::posix_time;

typedef local_adjustor<ptime, -5, us_dst> EasternTZ;

typedef local_adjustor<ptime, -7, no_dst> ArizonaTZ;

ptime NYtoAZ(prime nytime) {

 ptime utctime = EasternTZ::local_to_utc(nytime);

 return ArizonaTZ::utc_to_local(utctime);

}

int main() {

 // May 1st 2004.

 boost::gregorian::date thedate(2004, 6, 1);

 ptime nytime(thedate, hours(19)); // 7 pm

 ptime aztime = NYtoAZ(nytime);

 cout << "1 мая 2004 г. когда было " << nytime.time_of_day().hours();

 cout << ":00 часов в Нью-Йорке, было " << aztime.time_of_day().hours();

 cout << ":00 часов в Аризоне" << endl;

}

Программа из примера 5.8 выводит следующее.

1 мая 2004 г., когда было 19:00 часов в Нью-Йорке, было 16:00 часов в Аризоне

Обсуждение

Преобразование часовых поясов в примере 5.8 выполняется в два шага. Вначале время преобразуется в UTC, а затем время в UTC преобразуется во второй часовой пояс. Заметьте, что часовые пояса в библиотеке Boost date_time представлены как типы, использующие шаблон класса local_adjustor. Каждый тип содержит функции преобразования, которые преобразуют из данного часового пояса в UTC (функция local_tc_utс) и из UTC в данный часовой пояс (функция utc_to_local).