174 using period = std::ratio<1, 1'000'000>;
175 using duration = std::chrono::duration<rep, period>;
176 using time_point = std::chrono::time_point<aosn_timestamp>;
177 static constexpr bool is_steady =
false;
179 static constexpr rep f_second = 1000;
180 static constexpr rep f_minute = 60;
181 static constexpr rep f_hour = 60;
182 static constexpr rep f_day = 24;
183 static constexpr rep f_week = 7;
185 static constexpr rep one_second = f_second;
186 static constexpr rep one_minute = f_minute * one_second;
187 static constexpr rep one_hour = f_hour * one_minute;
188 static constexpr rep one_day = f_day * one_hour;
189 static constexpr rep one_week = f_week * one_day;
194 static time_point
now() noexcept
198 GetSystemTimeAsFileTime(&t);
210 static std::time_t
to_time_t(_In_
const time_point tp)
noexcept
212 return tp.time_since_epoch().count() / one_second - 210866803200;
220 return time_point(duration((
static_cast<rep
>(t) + 210866803200) * one_second));
227 static time_point
from_system(_In_
const SYSTEMTIME& t)
noexcept
230 static_cast<uint8_t
>(t.wDay),
static_cast<uint8_t
>(t.wMonth),
static_cast<int32_t
>(t.wYear),
231 static_cast<uint8_t
>(t.wHour),
static_cast<uint8_t
>(t.wMinute),
static_cast<uint8_t
>(t.wSecond),
static_cast<uint16_t
>(t.wMilliseconds));
237 static time_point
from_system(_In_
const FILETIME& t)
noexcept
239 uint64_t x = ((
static_cast<uint64_t
>(t.dwHighDateTime)) << 32) | t.dwLowDateTime;
240 return time_point(duration(
static_cast<rep
>(x / 10000 + 199222329600000)));
249 if (!VariantTimeToSystemTime(t, &st))
250 throw std::invalid_argument(
"failed to convert date from VARIANT_DATE");
257 static time_point
from_system(_In_
const struct timespec& t)
noexcept
259 return time_point(duration(
static_cast<rep
>(
from_time_t(t.tv_sec).time_since_epoch().count() + t.tv_nsec / 1000)));
263 static void to_system(_In_ time_point tp, _Out_
struct tm& date)
noexcept
265 uint8_t day, month, hour, minute, second;
266 uint16_t millisecond;
268 to_dmy(tp, &day, &month, &year, &hour, &minute, &second, &millisecond);
269 date.tm_sec = second;
270 date.tm_min = minute;
273 date.tm_mon = month - 1;
274 date.tm_year = year - 1900;
283 static aosn_date::time_point
to_date(_In_ time_point tp)
noexcept
285 return aosn_date::time_point(aosn_date::duration(
static_cast<aosn_date::rep
>(tp.time_since_epoch().count() / one_day)));
291 static time_point
from_date(_In_ aosn_date::time_point date)
noexcept
293 return time_point(duration(
static_cast<rep
>(date.time_since_epoch().count()) * one_day));
300 _In_ uint8_t day, _In_ uint8_t month, _In_ int32_t year,
301 _In_ uint8_t hour, _In_ uint8_t minute, _In_ uint8_t second, _In_ uint16_t millisecond)
noexcept
303 return time_point(duration(
304 (
static_cast<rep
>(
aosn_date::from_dmy(day, month, year).time_since_epoch().count()) * one_day) +
305 (
static_cast<rep
>(hour) * one_hour +
static_cast<rep
>(minute) * one_minute +
static_cast<rep
>(second) * one_second + millisecond)));
311 static void to_dmy(_In_
const time_point tp,
312 _Out_opt_ uint8_t* day, _Out_opt_ uint8_t* month, _Out_opt_ int32_t* year,
313 _Out_opt_ uint8_t* hour, _Out_opt_ uint8_t* minute, _Out_opt_ uint8_t* second, _Out_opt_ uint16_t* millisecond)
noexcept
316 int32_t u =
static_cast<int32_t
>(tp.time_since_epoch().count() % one_day);
317 if (millisecond) *millisecond =
static_cast<uint16_t
>(u % f_second);
319 if (second) *second =
static_cast<uint8_t
>(u % f_minute);
321 if (minute) *minute =
static_cast<uint8_t
>(u % f_hour);
323 if (hour) *hour =
static_cast<uint8_t
>(u);
326 template<
class _Traits = std::
char_traits<
char>,
class _Ax = std::allocator<
char>>
327 static std::basic_string<char, _Traits, _Ax> to_str(_In_
const time_point tp, _In_z_
const char* format, _In_opt_ locale_t locale)
331 std::basic_string<char, _Traits, _Ax> str;
332 char stack_buffer[1024 /
sizeof(char)];
335 n = _strftime_l(stack_buffer, _countof(stack_buffer), format, &date, locale);
337 n = strftime_l(stack_buffer, _countof(stack_buffer), format, &date, locale);
340 str.assign(stack_buffer, stack_buffer + n);
343 size_t num_chars = stdex::mul(_countof(stack_buffer), 2);
345 std::unique_ptr<char> buf(
new char[num_chars]);
347 n = _strftime_l(buf.get(), num_chars, format, &date, locale);
349 n = strftime_l(buf.get(), num_chars, format, &date, locale);
352 str.assign(buf.get(), buf.get() + n);
355 num_chars = stdex::mul(num_chars, 2);
359 template<
class _Traits = std::
char_traits<
wchar_t>,
class _Ax = std::allocator<
wchar_t>>
360 static std::basic_string<wchar_t, _Traits, _Ax> to_str(_In_
const time_point tp, _In_z_
const wchar_t* format, _In_opt_ locale_t locale)
364 std::basic_string<wchar_t, _Traits, _Ax> str;
365 wchar_t stack_buffer[1024 /
sizeof(wchar_t)];
368 n = _wcsftime_l(stack_buffer, _countof(stack_buffer), format, &date, locale);
370 n = wcsftime_l(stack_buffer, _countof(stack_buffer), format, &date, locale);
373 str.assign(stack_buffer, stack_buffer + n);
376 size_t num_chars = stdex::mul(_countof(stack_buffer), 2);
378 std::unique_ptr<wchar_t> buf(
new wchar_t[num_chars]);
380 n = _wcsftime_l(buf.get(), num_chars, format, &date, locale);
382 n = wcsftime_l(buf.get(), num_chars, format, &date, locale);
385 str.assign(buf.get(), buf.get() + n);
388 num_chars = stdex::mul(num_chars, 2);
392 template<
class _Traits = std::
char_traits<
char>,
class _Ax = std::allocator<
char>>
393 static std::basic_string<char, _Traits, _Ax> to_rfc822(_In_
const time_point tp)
395 return to_str(tp,
"%a, %d %b %Y %H:%M:%S GMT", locale_C.get());
static time_point from_dmy(uint8_t day, uint8_t month, int32_t year, uint8_t hour, uint8_t minute, uint8_t second, uint16_t millisecond) noexcept
Returns time point from calendar day, month, year and time.
Definition chrono.hpp:299
static void to_dmy(const time_point tp, uint8_t *day, uint8_t *month, int32_t *year, uint8_t *hour, uint8_t *minute, uint8_t *second, uint16_t *millisecond) noexcept
Returns calendar day, month, year and time from time point.
Definition chrono.hpp:311