4#ifndef _Stroika_Foundation_Time_DateTime_h_
5#define _Stroika_Foundation_Time_DateTime_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
15#if qStroika_Platform_Windows
20#include "Stroika/Foundation/Common/Common.h"
22#include "Stroika/Foundation/Math/Common.h"
53namespace Stroika::Foundation::Time {
55 using Characters::String;
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_Platform_POSIX
133 explicit DateTime (const ::timeval& tmTime,
const optional<Timezone>& tz =
Timezone::kUnknown)
noexcept;
134#elif qStroika_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;
152 enum class LocaleIndependentFormat {
178 static constexpr auto kISO8601Format = LocaleIndependentFormat::eISO8601;
197 static constexpr auto kRFC1123Format = LocaleIndependentFormat::eRFC1123;
215 static constexpr auto kHTTPDateFormat = LocaleIndependentFormat::eHTTPDate;
221 static constexpr string_view kLocaleStandardFormat =
"%c"sv;
227 static constexpr string_view kLocaleStandardAlternateFormat =
"%Ec"sv;
243 static constexpr string_view kShortLocaleFormatPattern =
"%x %X"sv;
254 static const Traversal::Iterable<String> kDefaultParseFormats;
257 class FormatException;
280 static DateTime Parse (
const String& rep, LocaleIndependentFormat format);
281 static DateTime Parse (
const String& rep,
const locale& l = locale{});
282 static DateTime Parse (
const String& rep,
const locale& l,
const String& formatPattern);
283 static DateTime Parse (
const String& rep,
const locale& l,
const Traversal::Iterable<String>& formatPatterns);
284 static DateTime Parse (
const String& rep,
const String& formatPattern);
296 static optional<DateTime> ParseQuietly (
const String& rep, LocaleIndependentFormat format,
size_t* consumedCharacters =
nullptr);
297 static optional<DateTime> ParseQuietly (
const String& rep,
const String& formatPattern,
size_t* consumedCharacters =
nullptr);
298 static optional<DateTime> ParseQuietly (
const String& rep,
const locale& l,
const String& formatPattern,
size_t* consumedCharacters =
nullptr);
299 static optional<DateTime> ParseQuietly (
const String& rep,
const locale& l,
const Traversal::Iterable<String>& formatPatterns = kDefaultParseFormats,
300 size_t* consumedCharacters =
nullptr);
304 static optional<DateTime> ParseQuietly_ (
const wstring& rep,
const time_get<wchar_t>& tmget,
const String& formatPattern,
size_t* consumedCharacters);
310 static DateTime Now () noexcept;
318 static DateTime NowUTC () noexcept;
324 static Date GetToday () noexcept;
330 static const DateTime kMin;
336 static const DateTime kMax;
341 nonvirtual constexpr optional<Timezone> GetTimezone () const noexcept;
350 nonvirtual DateTime AsLocalTime () const;
363 nonvirtual DateTime AsUTC () const;
374 nonvirtual DateTime AsTimezone (Timezone tz) const;
380 nonvirtual optional<
bool> IsDaylightSavingsTime () const;
393 enum class NonStandardPrintFormat : uint8_t {
394 eCurrentLocale_WithZerosStripped,
396 eDEFAULT = eCurrentLocale_WithZerosStripped,
402 static constexpr NonStandardPrintFormat eCurrentLocale_WithZerosStripped = NonStandardPrintFormat::eCurrentLocale_WithZerosStripped;
433 nonvirtual String Format (NonStandardPrintFormat pf = NonStandardPrintFormat::eDEFAULT)
const;
434 nonvirtual String Format (LocaleIndependentFormat format)
const;
435 nonvirtual String Format (
const locale& l)
const;
436 nonvirtual String Format (
const locale& l,
const String& formatPattern)
const;
437 nonvirtual String Format (
const String& formatPattern)
const;
443 nonvirtual String
ToString ()
const;
449 nonvirtual Date::JulianDayNumber DaysSince ()
const;
475 template <
typename T>
476 nonvirtual T As () const
478#if !qCompilerAndStdLib_template_requires_doesnt_work_with_specialization_Buggy
479 requires (Common::IAnyOf<T, time_t,
struct tm, struct timespec, Date, Characters::String
480#if qStroika_Platform_Windows
485 Common::ITimePoint<T>)
493 nonvirtual constexpr Date GetDate () const noexcept;
505 nonvirtual constexpr optional<TimeOfDay> GetTimeOfDay () const noexcept;
516 nonvirtual DateTime Add (const Duration& d) const;
527 nonvirtual DateTime AddDays (int days) const;
541 nonvirtual DateTime AddSeconds (int64_t seconds) const;
551 nonvirtual Duration Difference (const DateTime& rhs) const;
556 nonvirtual strong_ordering operator<=> (const DateTime& rhs) const;
561 nonvirtual bool operator== (const DateTime& rhs) const;
564 struct ThreeWayComparer;
567 template <typename T>
568 nonvirtual T As_Simple_ () const
569#if !qCompilerAndStdLib_template_requires_doesnt_work_with_specialization_Buggy
570 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>)
573#if qStroika_Platform_Windows
574 nonvirtual SYSTEMTIME AsSYSTEMTIME_ () const;
576 template <typename CLOCK_T, typename DURATION_T>
577 nonvirtual time_point<CLOCK_T, DURATION_T> As_TP_ () const;
580 optional<Timezone> fTimezone_;
582 optional<TimeOfDay> fTimeOfDay_;
585 [[deprecated ("Since Stroika v3.0d5 - just use AsLocalTime ().As<Time::TimePointSeconds> ()")]] Time::TimePointSeconds ToTickCount () const
587 return AsLocalTime ().As<Time::TimePointSeconds> ();
589 [[deprecated (
"Since Stroika v3.0d5 - just construct the DateTime with the value of GetTickCount()")]]
static DateTime
590 FromTickCount (Time::TimePointSeconds tickCount)
592 return DateTime{tickCount};
596 class DateTime::FormatException :
public Execution::Exception<runtime_error> {
604 static const FormatException kThe;
606 inline const DateTime::FormatException DateTime::FormatException::kThe;
608 inline const Traversal::Iterable<String> DateTime::kDefaultParseFormats{
609 kLocaleStandardFormat,
610 kLocaleStandardAlternateFormat,
613 "%Y-%b-%d %H:%M:%S"sv,
622 struct DateTime::ThreeWayComparer : Common::ComparisonRelationDeclarationBase<Common::ComparisonRelationType::eThreeWayCompare> {
625 constexpr ThreeWayComparer (
bool coerceToCommonTimezone =
true);
629 nonvirtual strong_ordering operator() (
const DateTime& lhs,
const DateTime& rhs)
const;
630 bool fCoerceToCommonTimezone;
636 DateTime operator+ (
const DateTime& lhs,
const Duration& rhs);
641 Duration operator- (
const DateTime& lhs,
const DateTime& rhs);
646 DateTime operator- (
const DateTime&,
const Duration& rhs);
647 Duration operator- (
const DateTime&,
const DateTime& rhs);
651namespace Stroika::Foundation::Math {
652 bool NearlyEquals (Time::DateTime l, Time::DateTime r);
653 bool NearlyEquals (Time::DateTime l, Time::DateTime r, Time::DurationSeconds epsilon);
656namespace Stroika::Foundation::Time {
663 struct DefaultOpenness<Time::DateTime> : ExplicitOpenness<Openness::eClosed, Openness::eClosed> {};
665 struct DefaultDifferenceTypes<Time::DateTime> : ExplicitDifferenceTypes<Time::Duration> {};
672 static const Time::DateTime kLowerBound;
673 static const Time::DateTime kUpperBound;
687#include "DateTime.inl"
#define Stroika_Define_Enum_Bounds(FIRST_ITEM, LAST_ITEM)
static const optional< Timezone > kUnknown
static const Timezone kUTC
static const Timezone kLocalTime
STRING_TYPE ToString(FLOAT_TYPE f, const ToStringOptions &options={})