Stroika Library 3.0d16
 
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> or
101#if qStroika_Foundation_Common_Platform_Windows
102 same_as<T, SYSTEMTIME> or
103#endif
104 Common::ITimePoint<T>)
105#endif
106 {
107 if constexpr (Common::IAnyOf<T, time_t, struct tm, struct timespec, Date, Characters::String>) {
108 return As_Simple_<T> ();
109 }
110#if qStroika_Foundation_Common_Platform_Windows
111 else if constexpr (same_as<T, SYSTEMTIME>) {
112 return AsSYSTEMTIME_ ();
113 }
114#endif
115 else if constexpr (Common::ITimePoint<T>) {
116 return As_TP_<typename T::clock, typename T::duration> ();
117 }
118 }
119 inline Date DateTime::GetToday () noexcept
120 {
121 return Now ().GetDate ();
122 }
123 inline constexpr optional<Timezone> DateTime::GetTimezone () const noexcept
124 {
125 return fTimezone_;
126 }
127 inline strong_ordering DateTime::operator<=> (const DateTime& rhs) const
128 {
129 return ThreeWayComparer{}(*this, rhs);
130 }
131 inline bool DateTime::operator== (const DateTime& rhs) const
132 {
133 return ThreeWayComparer{}(*this, rhs) == 0;
134 }
135
136 /*
137 ********************************************************************************
138 ************************* DateTime::ThreeWayComparer ***************************
139 ********************************************************************************
140 */
141 constexpr DateTime::ThreeWayComparer::ThreeWayComparer (bool coerceToCommonTimezone)
142 : fCoerceToCommonTimezone{coerceToCommonTimezone}
143 {
144 }
145
146}
147
149 template <>
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"},
153 }}};
154 template <>
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"},
158 }}};
159}
160
162 inline constexpr Time::DateTime Default<Time::DateTime>::kLowerBound{Time::DateTime::kMin};
163 inline constexpr Time::DateTime Default<Time::DateTime>::kUpperBound{Time::DateTime::kMax};
164}
static const Date kMax
Definition Date.h:548
static const Date kMin
Definition Date.h:542
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