9#include <botan/internal/calendar.h>
11#include <botan/exceptn.h>
20std::tm do_gmtime(std::time_t time_val) {
23#if defined(BOTAN_TARGET_OS_HAS_WIN32)
24 ::gmtime_s(&tm, &time_val);
25#elif defined(BOTAN_TARGET_OS_HAS_POSIX1)
26 ::gmtime_r(&time_val, &tm);
28 std::tm* tm_p = std::gmtime(&time_val);
30 throw Encoding_Error(
"time_t_to_tm could not convert");
46size_t days_since_epoch(uint32_t year, uint32_t month, uint32_t day) {
50 const uint32_t era = year / 400;
51 const uint32_t yoe = year - era * 400;
52 const uint32_t doy = (153 * (month + (month > 2 ? -3 : 9)) + 2) / 5 + day - 1;
53 const uint32_t doe = yoe * 365 + yoe / 4 - yoe / 100 + doy;
54 return era * 146097 + doe - 719468;
61 throw Invalid_Argument(
"calendar_point::to_std_timepoint() does not support years before 1970");
68 if constexpr(
sizeof(std::time_t) == 4) {
70 throw Invalid_Argument(
"calendar_point::to_std_timepoint() does not support years after 2037 on this system");
76 throw Invalid_Argument(
"calendar_point::to_std_timepoint() does not support years after 2400");
79 const uint64_t seconds_64 =
82 const time_t seconds_time_t =
static_cast<time_t
>(seconds_64);
84 if(seconds_64 - seconds_time_t != 0) {
88 return std::chrono::system_clock::from_time_t(seconds_time_t);
93 std::stringstream output;
94 output << std::setfill(
'0') << std::setw(4) <<
year() <<
"-" << std::setw(2) <<
month() <<
"-" << std::setw(2)
95 <<
day() <<
"T" << std::setw(2) <<
hour() <<
":" << std::setw(2) <<
minutes() <<
":" << std::setw(2)
101 std::tm tm = do_gmtime(std::chrono::system_clock::to_time_t(time_point));
103 m_year = tm.tm_year + 1900;
104 m_month = tm.tm_mon + 1;
107 m_minutes = tm.tm_min;
108 m_seconds = tm.tm_sec;
std::string to_string() const
std::chrono::system_clock::time_point to_std_timepoint() const
calendar_point(uint32_t y, uint32_t mon, uint32_t d, uint32_t h, uint32_t min, uint32_t sec)