Stroika Library 3.0d18
 
Loading...
Searching...
No Matches
DateTime.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include <chrono>
5
7
8namespace Stroika::Foundation::Time {
9
10 /*
11 ********************************************************************************
12 ********************************** DateTime ************************************
13 ********************************************************************************
14 */
15 inline constexpr DateTime::DateTime (const Date& d) noexcept
16 : fTimezone_{Timezone::kUnknown}
17 , fDate_{d}
18 {
19 }
20 inline constexpr DateTime::DateTime (const DateTime& dt, const Date& updateDate) noexcept
21 : fTimezone_{dt.GetTimezone ()}
22 , fDate_{updateDate}
23 , fTimeOfDay_{dt.GetTimeOfDay ().has_value () ? optional<TimeOfDay> (*dt.GetTimeOfDay ()) : nullopt}
24 {
25 }
26 inline constexpr DateTime::DateTime (const DateTime& dt, const TimeOfDay& updateTOD) noexcept
27 : fTimezone_{dt.GetTimezone ()}
28 , fDate_{dt.GetDate ()}
29 , fTimeOfDay_{updateTOD}
30 {
31 }
32 inline constexpr DateTime::DateTime (const Date& date, const optional<TimeOfDay>& timeOfDay, const optional<Timezone>& tz) noexcept
33 : fTimezone_{tz}
34 , fDate_{date}
35 , fTimeOfDay_{timeOfDay}
36 {
37 }
38 template <Common::ITimePoint T>
39 DateTime::DateTime (T timePoint) noexcept
40 : DateTime{chrono::system_clock::to_time_t (Time::clock_cast<chrono::system_clock> (timePoint))}
41 {
42 }
43 inline constexpr DateTime DateTime::kMin{Date::kMin, optional<TimeOfDay>{TimeOfDay::kMin}, Timezone::kUnknown};
44 inline constexpr DateTime DateTime::kMax{Date::kMax, optional<TimeOfDay>{TimeOfDay::kMax}, Timezone::kUnknown};
45 inline constexpr Date DateTime::GetDate () const noexcept
46 {
47 return fDate_;
48 }
49 inline constexpr optional<TimeOfDay> DateTime::GetTimeOfDay () const noexcept
50 {
51 return fTimeOfDay_;
52 }
53 inline DateTime DateTime::Parse (const String& rep, const locale& l)
54 {
55 return Parse (rep, l, kDefaultParseFormats);
56 }
57 inline optional<DateTime> DateTime::ParseQuietly (const String& rep, const String& formatPattern, size_t* consumedCharacters)
58 {
59 return ParseQuietly (rep, locale{}, formatPattern, consumedCharacters);
60 }
61 inline optional<DateTime> DateTime::ParseQuietly (const String& rep, const locale& l, const String& formatPattern, size_t* consumedCharacters)
62 {
63 if (rep.empty ()) [[unlikely]] {
64 return nullopt; // Stroika v2.1 erroneously threw FormatException::kThe here - missing the word 'Quietly'
65 }
66 return ParseQuietly_ (rep.As<wstring> (), use_facet<time_get<wchar_t>> (l), formatPattern, consumedCharacters);
67 }
68#if !qCompilerAndStdLib_template_requires_doesnt_work_with_specialization_Buggy
69 template <>
70 time_t DateTime::As_Simple_ () const;
71 template <>
72 tm DateTime::As_Simple_ () const;
73 template <>
74 timespec DateTime::As_Simple_ () const;
75#endif
76 template <>
77 inline Date DateTime::As_Simple_ () const
78 {
79 return fDate_;
80 }
81 template <>
82 inline Characters::String DateTime::As_Simple_ () const
83 {
84 return this->Format ();
85 }
86 template <typename CLOCK_T, typename DURATION_T>
87 time_point<CLOCK_T, DURATION_T> DateTime::As_TP_ () const
88 {
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>) {
91 return t;
92 }
93 else {
94 return chrono::time_point_cast<DURATION_T> (t);
95 }
96 }
97 template <typename 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
101#if qStroika_Foundation_Common_Platform_Windows
102 ,
103 SYSTEMTIME
104#endif
105 > or
106 Common::ITimePoint<T>)
107#endif
108 {
109 if constexpr (Common::IAnyOf<T, time_t, struct tm, struct timespec, Date, Characters::String>) {
110 return As_Simple_<T> ();
111 }
112#if qStroika_Foundation_Common_Platform_Windows
113 else if constexpr (same_as<T, SYSTEMTIME>) {
114 return AsSYSTEMTIME_ ();
115 }
116#endif
117 else if constexpr (Common::ITimePoint<T>) {
118 return As_TP_<typename T::clock, typename T::duration> ();
119 }
120 }
121 inline Date DateTime::GetToday () noexcept
122 {
123 return Now ().GetDate ();
124 }
125 inline constexpr optional<Timezone> DateTime::GetTimezone () const noexcept
126 {
127 return fTimezone_;
128 }
129 inline strong_ordering DateTime::operator<=> (const DateTime& rhs) const
130 {
131 return ThreeWayComparer{}(*this, rhs);
132 }
133 inline bool DateTime::operator== (const DateTime& rhs) const
134 {
135 return ThreeWayComparer{}(*this, rhs) == 0;
136 }
137
138 /*
139 ********************************************************************************
140 ************************* DateTime::ThreeWayComparer ***************************
141 ********************************************************************************
142 */
143 constexpr DateTime::ThreeWayComparer::ThreeWayComparer (bool coerceToCommonTimezone)
144 : fCoerceToCommonTimezone{coerceToCommonTimezone}
145 {
146 }
147
148}
149
151 template <>
152 constexpr EnumNames<Stroika::Foundation::Time::DateTime::LocaleIndependentFormat> DefaultNames<Stroika::Foundation::Time::DateTime::LocaleIndependentFormat>::k{{{
153 {Stroika::Foundation::Time::DateTime::LocaleIndependentFormat::eISO8601, L"ISO-8601"},
154 {Stroika::Foundation::Time::DateTime::LocaleIndependentFormat::eRFC1123, L"RFC-1123"},
155 }}};
156 template <>
157 constexpr EnumNames<Stroika::Foundation::Time::DateTime::NonStandardPrintFormat> DefaultNames<Stroika::Foundation::Time::DateTime::NonStandardPrintFormat>::k{{{
158 {Stroika::Foundation::Time::DateTime::NonStandardPrintFormat::eCurrentLocale_WithZerosStripped,
159 L"Current-Locale-With-Zeros-Stripped"},
160 }}};
161}
162
164 inline constexpr Time::DateTime Default<Time::DateTime>::kLowerBound{Time::DateTime::kMin};
165 inline constexpr Time::DateTime Default<Time::DateTime>::kUpperBound{Time::DateTime::kMax};
166}
static const Date kMax
Definition Date.h:550
static const Date kMin
Definition Date.h:544
static const TimeOfDay kMin
Definition TimeOfDay.h:174
static const TimeOfDay kMax
Definition TimeOfDay.h:181
static const optional< Timezone > kUnknown
Definition Timezone.h:159