Если у вас есть c ++ 20, или вы будете использовать библиотеку дат / времени Говарда Хиннанта, то ответ Говарда Хэннанта будет лучше, так как он дает вам точку времени constexpr.
Однако, если у вас еще нет c ++ 20 и вы хотите избежать добавления дополнительных внешних библиотек, тогда этот ответ по-прежнему полезен.
Вы можете установить элементы std::tm
индивидуально в инициализаторе, чтобы избежать анализа строки.
// 9th January, 2014
#define DAY 9
#define MONTH 1
#define YEAR 2014
std::tm tm = { .tm_sec = 0,
.tm_min = 0,
.tm_hour = 0,
.tm_mday = (DAY),
.tm_mon = (MONTH) - 1,
.tm_year = (YEAR) - 1900,
};
tm.tm_isdst = -1; // Use DST value from local time zone
auto tp = std::chrono::system_clock::from_time_t(std::mktime(&tm));
Инициализация нулевых полей для времени дня происходит только из-за ограничения gcc на нетривиально назначенные инициализаторы в коде C ++ и может быть опущена, если требуется полуночи для скомпилированной даты.
Важно отметить, что mktime
будет интерпретировать tm
как местное время , а не по Гринвичу или UTC. Если tm_isdst
не установлен в -1, это будет местное стандартное время, даже если в указанное местное время будет использоваться летнее время (летнее время).
Получение момента времени UTC из std::tm
, проблема, которой поделился ваш пример, решается в других вопросах, таких как Простой способ преобразования struct tm (выраженной в UTC) в тип time_t