8namespace Stroika::Foundation::Time {
15 inline constexpr DateTime::DateTime (
const Date& d) noexcept
20 inline constexpr DateTime::DateTime (
const DateTime& dt,
const Date& updateDate) noexcept
21 : fTimezone_{dt.GetTimezone ()}
23 , fTimeOfDay_{dt.GetTimeOfDay ().has_value () ? optional<TimeOfDay> (*dt.GetTimeOfDay ()) : nullopt}
26 inline constexpr DateTime::DateTime (
const DateTime& dt,
const TimeOfDay& updateTOD) noexcept
27 : fTimezone_{dt.GetTimezone ()}
28 , fDate_{dt.GetDate ()}
29 , fTimeOfDay_{updateTOD}
32 inline constexpr DateTime::DateTime (
const Date& date,
const optional<TimeOfDay>& timeOfDay,
const optional<Timezone>& tz) noexcept
35 , fTimeOfDay_{timeOfDay}
38 template <Common::ITimePo
int T>
39 DateTime::DateTime (T timePoint) noexcept
40 : DateTime{chrono::system_clock::to_time_t (Time::clock_cast<chrono::system_clock> (timePoint))}
45 inline constexpr Date DateTime::GetDate () const noexcept
49 inline constexpr optional<TimeOfDay> DateTime::GetTimeOfDay () const noexcept
53 inline DateTime DateTime::Parse (
const String& rep,
const locale& l)
55 return Parse (rep, l, kDefaultParseFormats);
57 inline optional<DateTime> DateTime::ParseQuietly (
const String& rep,
const String& formatPattern,
size_t* consumedCharacters)
59 return ParseQuietly (rep, locale{}, formatPattern, consumedCharacters);
61 inline optional<DateTime> DateTime::ParseQuietly (
const String& rep,
const locale& l,
const String& formatPattern,
size_t* consumedCharacters)
63 if (rep.empty ()) [[unlikely]] {
66 return ParseQuietly_ (rep.As<wstring> (), use_facet<time_get<wchar_t>> (l), formatPattern, consumedCharacters);
68#if !qCompilerAndStdLib_template_requires_doesnt_work_with_specialization_Buggy
70 time_t DateTime::As_Simple_ ()
const;
72 tm DateTime::As_Simple_ ()
const;
74 timespec DateTime::As_Simple_ ()
const;
77 inline Date DateTime::As_Simple_ ()
const
82 inline Characters::String DateTime::As_Simple_ ()
const
84 return this->Format ();
86 template <
typename CLOCK_T,
typename DURATION_T>
87 time_point<CLOCK_T, DURATION_T> DateTime::As_TP_ ()
const
89 auto t = Time::clock_cast<CLOCK_T> (chrono::system_clock::from_time_t (this->As<time_t> ()));
90 if constexpr (same_as<DURATION_T, chrono::system_clock::duration>) {
94 return chrono::time_point_cast<DURATION_T> (t);
98 inline T DateTime::As () const
99#if !qCompilerAndStdLib_template_requires_doesnt_work_with_specialization_Buggy
100 requires (Common::IAnyOf<T, time_t, struct tm, struct timespec, Date, Characters::String> or
101#if qStroika_Foundation_Common_Platform_Windows
102 same_as<T, SYSTEMTIME> or
104 Common::ITimePoint<T>)
107 if constexpr (Common::IAnyOf<T, time_t, struct tm, struct timespec, Date, Characters::String>) {
108 return As_Simple_<T> ();
110#if qStroika_Foundation_Common_Platform_Windows
111 else if constexpr (same_as<T, SYSTEMTIME>) {
112 return AsSYSTEMTIME_ ();
115 else if constexpr (Common::ITimePoint<T>) {
116 return As_TP_<typename T::clock, typename T::duration> ();
119 inline Date DateTime::GetToday () noexcept
121 return Now ().GetDate ();
123 inline constexpr optional<Timezone> DateTime::GetTimezone () const noexcept
127 inline strong_ordering DateTime::operator<=> (
const DateTime& rhs)
const
129 return ThreeWayComparer{}(*
this, rhs);
131 inline bool DateTime::operator== (
const DateTime& rhs)
const
133 return ThreeWayComparer{}(*
this, rhs) == 0;
141 constexpr DateTime::ThreeWayComparer::ThreeWayComparer (
bool coerceToCommonTimezone)
142 : fCoerceToCommonTimezone{coerceToCommonTimezone}
150 constexpr EnumNames<Stroika::Foundation::Time::DateTime::LocaleIndependentFormat> DefaultNames<Stroika::Foundation::Time::DateTime::LocaleIndependentFormat>::k{{{
151 {Stroika::Foundation::Time::DateTime::LocaleIndependentFormat::eISO8601, L
"ISO-8601"},
152 {Stroika::Foundation::Time::DateTime::LocaleIndependentFormat::eRFC1123, L
"RFC-1123"},
155 constexpr EnumNames<Stroika::Foundation::Time::DateTime::NonStandardPrintFormat> DefaultNames<Stroika::Foundation::Time::DateTime::NonStandardPrintFormat>::k{{{
156 {Stroika::Foundation::Time::DateTime::NonStandardPrintFormat::eCurrentLocale_WithZerosStripped,
157 L
"Current-Locale-With-Zeros-Stripped"},
162 inline constexpr Time::DateTime Default<Time::DateTime>::kLowerBound{Time::DateTime::kMin};
163 inline constexpr Time::DateTime Default<Time::DateTime>::kUpperBound{Time::DateTime::kMax};
static const TimeOfDay kMin
static const TimeOfDay kMax
static const optional< Timezone > kUnknown