В дополнение к правильному (и опрошенному) ответу Jerry Coffin, я хотел показать, как это вычисление может быть выполнено с помощью modern C++11/14 library (бесплатный и с открытым исходным кодом).
я сохранил API же в интересах сделать код легко сравнить:
template <class Duration>
auto
getGMT(date::local_time<Duration> rawtime, const date::time_zone* tz)
{
return tz->to_sys(rawtime);
}
Это возвращает std::chrono::time_point<system_clock, Duration>
где Duration
является мельче входа Duration
и seconds
. Если ragtime
не имеет уникального отображения в UTC в соответствии с указанным часовым поясом, будет выбрано исключение. Такое событие может произойти (например), если rawtime
во время перехода на летнее время происходит и происходит дважды, или вообще нет. При желании существует API для исключения исключения, если вы хотите «заранее решить», как вы хотите сопоставить двусмысленные и несуществующие локальные времена в UTC.
Эта функция может осуществляться следующим образом:
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono_literals;
std::cout << getGMT(local_days{sep/28/2012} + 15h + 54min + 24s,
current_zone()) << " UTC\n";
std::cout << getGMT(local_days{sep/28/2012} + 15h + 54min + 24s,
locate_zone("America/New_York")) << " UTC\n";
}
Это упражнения код дважды:
- С независимо от текущего часового пояса для этого компьютера.
- С часовым поясом «Америка/New_York»
Для меня эти оба являются в то же время зона, в результате чего следующий вывод:
2012-09-28 19:54:24 UTC
2012-09-28 19:54:24 UTC
не только проще использовать эту библиотеку чем BSD ctime API, , но этот API имеет тип безопасности. Например, точка времени UTC и местная точка времени представлены различными типами, позволяя компилятору рассказать вам, случайно ли вы используете неправильный. В отличие от этого BSD ctime API использует тот же тип (tm
) как по местному времени, так и по UTC.
STD имеет функцию: tm * gmtime (const time_t * time); Вы пробовали это? –