4#ifndef _Stroika_Foundation_Time_DateTime_h_
5#define _Stroika_Foundation_Time_DateTime_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
15#if qStroika_Foundation_Common_Platform_Windows
20#include "Stroika/Foundation/Common/Common.h"
22#include "Stroika/Foundation/Math/Common.h"
53namespace Stroika::Foundation::Time {
55 using Characters::String;
99 class [[nodiscard]] DateTime {
123 constexpr DateTime (DateTime&& src)
noexcept =
default;
124 constexpr DateTime (
const DateTime& src) =
default;
125 constexpr explicit DateTime (
const Date& d)
noexcept;
126 constexpr explicit DateTime (
const DateTime& dt,
const Date& updateDate)
noexcept;
127 constexpr explicit DateTime (
const DateTime& dt,
const TimeOfDay& updateTOD)
noexcept;
128 constexpr DateTime (
const Date& date,
const optional<TimeOfDay>& timeOfDay,
const optional<Timezone>& tz = Timezone::kUnknown)
noexcept;
129 explicit DateTime (time_t unixEpochTime)
noexcept;
130 explicit DateTime (const ::tm& tmTime,
const optional<Timezone>& tz = Timezone::kUnknown)
noexcept;
131 explicit DateTime (const ::timespec& tmTime,
const optional<Timezone>& tz = Timezone::kUnknown)
noexcept;
132#if qStroika_Foundation_Common_Platform_POSIX
133 explicit DateTime (const ::timeval& tmTime,
const optional<Timezone>& tz = Timezone::kUnknown)
noexcept;
134#elif qStroika_Foundation_Common_Platform_Windows
135 explicit DateTime (const ::SYSTEMTIME& sysTime,
const optional<Timezone>& tz = Timezone::kLocalTime)
noexcept;
136 explicit DateTime (const ::FILETIME& fileTime,
const optional<Timezone>& tz = Timezone::kUTC)
noexcept;
138 template <Common::ITimePo
int T>
139 explicit DateTime (T timePoint)
noexcept;
144 nonvirtual DateTime& operator= (DateTime&& rhs)
noexcept =
default;
145 nonvirtual DateTime& operator= (
const DateTime& rhs) =
default;
167 enum class LocaleIndependentFormat {
180 static constexpr auto kISO8601Format = LocaleIndependentFormat::eISO8601;
196 static constexpr auto kRFC1123Format = LocaleIndependentFormat::eRFC1123;
202 static constexpr string_view kLocaleStandardFormat =
"%c"sv;
208 static constexpr string_view kLocaleStandardAlternateFormat =
"%Ec"sv;
224 static constexpr string_view kShortLocaleFormatPattern =
"%x %X"sv;
235 static const Traversal::Iterable<String> kDefaultParseFormats;
238 class FormatException;
261 static DateTime Parse (
const String& rep, LocaleIndependentFormat format);
262 static DateTime Parse (
const String& rep,
const locale& l = locale{});
263 static DateTime Parse (
const String& rep,
const locale& l,
const String& formatPattern);
264 static DateTime Parse (
const String& rep,
const locale& l,
const Traversal::Iterable<String>& formatPatterns);
265 static DateTime Parse (
const String& rep,
const String& formatPattern);
277 static optional<DateTime> ParseQuietly (
const String& rep, LocaleIndependentFormat format,
size_t* consumedCharacters =
nullptr);
278 static optional<DateTime> ParseQuietly (
const String& rep,
const String& formatPattern,
size_t* consumedCharacters =
nullptr);
279 static optional<DateTime> ParseQuietly (
const String& rep,
const locale& l,
const String& formatPattern,
size_t* consumedCharacters =
nullptr);
280 static optional<DateTime> ParseQuietly (
const String& rep,
const locale& l,
const Traversal::Iterable<String>& formatPatterns = kDefaultParseFormats,
281 size_t* consumedCharacters =
nullptr);
285 static optional<DateTime> ParseQuietly_ (
const wstring& rep,
const time_get<wchar_t>& tmget,
const String& formatPattern,
size_t* consumedCharacters);
291 static DateTime Now () noexcept;
299 static DateTime NowUTC () noexcept;
305 static Date GetToday () noexcept;
311 static const DateTime kMin;
317 static const DateTime kMax;
322 nonvirtual constexpr optional<Timezone> GetTimezone () const noexcept;
331 nonvirtual DateTime AsLocalTime () const;
344 nonvirtual DateTime AsUTC () const;
355 nonvirtual DateTime AsTimezone (Timezone tz) const;
361 nonvirtual optional<
bool> IsDaylightSavingsTime () const;
374 enum class NonStandardPrintFormat : uint8_t {
375 eCurrentLocale_WithZerosStripped,
377 eDEFAULT = eCurrentLocale_WithZerosStripped,
383 static constexpr NonStandardPrintFormat eCurrentLocale_WithZerosStripped = NonStandardPrintFormat::eCurrentLocale_WithZerosStripped;
414 nonvirtual String Format (NonStandardPrintFormat pf = NonStandardPrintFormat::eDEFAULT)
const;
415 nonvirtual String Format (LocaleIndependentFormat format)
const;
416 nonvirtual String Format (
const locale& l)
const;
417 nonvirtual String Format (
const locale& l,
const String& formatPattern)
const;
418 nonvirtual String Format (
const String& formatPattern)
const;
424 nonvirtual String
ToString ()
const;
430 nonvirtual Date::JulianDayNumber DaysSince ()
const;
456 template <
typename T>
457 nonvirtual T As () const
459#if !qCompilerAndStdLib_template_requires_doesnt_work_with_specialization_Buggy
460 requires (Common::IAnyOf<T, time_t, struct tm, struct timespec, Date, Characters::String> or
461#if qStroika_Foundation_Common_Platform_Windows
462 same_as<T, SYSTEMTIME> or
464 Common::ITimePoint<T>)
472 nonvirtual
constexpr Date GetDate () const noexcept;
484 nonvirtual constexpr optional<TimeOfDay> GetTimeOfDay () const noexcept;
495 nonvirtual DateTime Add (const Duration& d) const;
506 nonvirtual DateTime AddDays (
int days) const;
520 nonvirtual DateTime AddSeconds (int64_t seconds) const;
530 nonvirtual Duration Difference (const DateTime& rhs) const;
535 nonvirtual strong_ordering operator<=> (const DateTime& rhs) const;
540 nonvirtual
bool operator== (const DateTime& rhs) const;
543 struct ThreeWayComparer;
546 template <typename T>
547 nonvirtual T As_Simple_ () const
548#if !qCompilerAndStdLib_template_requires_doesnt_work_with_specialization_Buggy
549 requires (same_as<T, time_t> or same_as<T, struct tm> or same_as<T, struct timespec> or same_as<T, Date> or same_as<T, Characters::String>)
552#if qStroika_Foundation_Common_Platform_Windows
553 nonvirtual SYSTEMTIME AsSYSTEMTIME_ ()
const;
555 template <
typename CLOCK_T,
typename DURATION_T>
556 nonvirtual time_point<CLOCK_T, DURATION_T> As_TP_ ()
const;
559 optional<Timezone> fTimezone_;
561 optional<TimeOfDay> fTimeOfDay_;
564 [[deprecated (
"Since Stroika v3.0d5 - just use AsLocalTime ().As<Time::TimePointSeconds> ()")]] Time::TimePointSeconds ToTickCount ()
const
566 return AsLocalTime ().As<Time::TimePointSeconds> ();
568 [[deprecated (
"Since Stroika v3.0d5 - just construct the DateTime with the value of GetTickCount()")]]
static DateTime
569 FromTickCount (Time::TimePointSeconds tickCount)
571 return DateTime{tickCount};
575 class DateTime::FormatException :
public Execution::RuntimeErrorException<> {
583 static const FormatException kThe;
585 inline const DateTime::FormatException DateTime::FormatException::kThe;
587 inline const Traversal::Iterable<String> DateTime::kDefaultParseFormats{
588 kLocaleStandardFormat,
589 kLocaleStandardAlternateFormat,
592 "%Y-%b-%d %H:%M:%S"sv,
601 struct DateTime::ThreeWayComparer : Common::ComparisonRelationDeclarationBase<Common::ComparisonRelationType::eThreeWayCompare> {
604 constexpr ThreeWayComparer (
bool coerceToCommonTimezone =
true);
608 nonvirtual strong_ordering operator() (
const DateTime& lhs,
const DateTime& rhs)
const;
609 bool fCoerceToCommonTimezone;
615 DateTime operator+ (
const DateTime& lhs,
const Duration& rhs);
620 Duration operator- (
const DateTime& lhs,
const DateTime& rhs);
625 DateTime operator- (
const DateTime&,
const Duration& rhs);
626 Duration operator- (
const DateTime&,
const DateTime& rhs);
630namespace Stroika::Foundation::Math {
631 bool NearlyEquals (Time::DateTime l, Time::DateTime r);
632 bool NearlyEquals (Time::DateTime l, Time::DateTime r, Time::DurationSeconds epsilon);
635namespace Stroika::Foundation::Time {
642 struct DefaultOpenness<Time::DateTime> : ExplicitOpenness<Openness::eClosed, Openness::eClosed> {};
644 struct DefaultDifferenceTypes<Time::DateTime> : ExplicitDifferenceTypes<Time::Duration> {};
651 static const Time::DateTime kLowerBound;
652 static const Time::DateTime kUpperBound;
666#include "DateTime.inl"
#define Stroika_Define_Enum_Bounds(FIRST_ITEM, LAST_ITEM)
STRING_TYPE ToString(FLOAT_TYPE f, const ToStringOptions &options={})