Используя этот free, open-source library:
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono_literals;
try
{
auto zone = locate_zone("America/New_York");
zone->to_sys(local_days{mar/13/2016} + 2h + 30min);
}
catch (const std::exception& e)
{
std::cout << e.what() << '\n';
}
}
Вывод этой программы:
2016-03-13 02:30 is in a gap between
2016-03-13 02:00:00 EST and
2016-03-13 03:00:00 EDT which are both equivalent to
2016-03-13 07:00:00 UTC
Короче говоря, эта программа пытается перевести дату локаль/время 2016- 03-13 02:30:00 по UTC, используя часовой пояс «Америка/Нью-Йорк». Перевод выдает исключение, потому что локального времени не существует. Также генерируется исключение (с другим сообщением об ошибке), если местное время неоднозначно, например, при настройке локальных часов назад с летнего времени.
Библиотека также предоставляет синтаксис для исключения этих исключений, если это желание.
Это работает на VS-2013, VS-2015, clang и gcc. Для этого требуется C++ 11, C++ 14 или C++ 1z.
Ссылка выше указывает на документацию. Вот хранилище GitHub:
https://github.com/HowardHinnant/date
Интригующий вопрос, обязательно. Вам также нужно поддерживать прыжок на второй день, например 30 июня 2015 года, 23.59.60? (Если это исключает API времени Google), я думаю, что * ускорить использование библиотек времени и времени будет лучшей отправной точкой.Я использую эти библиотеки, но не для этой конкретной вещи. – Bathsheba
Я отметил «форсировать дату-время» и, возможно, «новизну», поскольку я предполагаю, что решение может быть доступно из коробки для этого или не особенно сложно реализовать в этой структуре. – Bathsheba
Стандартная библиотека C++ не справляется со временем. Если вы нацеливаете Windows, вы можете использовать SystemTimeToFileTime() или SystemTimeToTzSpecificLocalTime(). Передача плохой даты приводит к сбою функции с ERROR_INVALID_PARAMETER. Если он должен быть кросс-платформенным, вам нужно пойти за покупками в библиотеку. –