9#include <botan/internal/calendar.h>
10#include <botan/exceptn.h>
19std::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;
62 throw Invalid_Argument(
"calendar_point::to_std_timepoint() does not support years before 1970");
68 if constexpr(
sizeof(std::time_t) == 4)
72 throw Invalid_Argument(
"calendar_point::to_std_timepoint() does not support years after 2037 on this system");
79 throw Invalid_Argument(
"calendar_point::to_std_timepoint() does not support years after 2400");
82 const uint64_t seconds_64 = (days_since_epoch(
year(),
month(),
day()) * 86400) +
85 const time_t seconds_time_t =
static_cast<time_t
>(seconds_64);
87 if(seconds_64 - seconds_time_t != 0)
92 return std::chrono::system_clock::from_time_t(seconds_time_t);
98 std::stringstream output;
99 output << std::setfill(
'0')
100 << std::setw(4) <<
year() <<
"-"
101 << std::setw(2) <<
month() <<
"-"
102 << std::setw(2) <<
day() <<
"T"
103 << std::setw(2) <<
hour() <<
":"
104 << std::setw(2) <<
minutes() <<
":"
111 std::tm tm = do_gmtime(std::chrono::system_clock::to_time_t(time_point));
113 m_year = tm.tm_year + 1900;
114 m_month = tm.tm_mon + 1;
117 m_minutes = tm.tm_min;
118 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)