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;
124 constexpr DateTime (DateTime&& src)
noexcept =
default;
125 constexpr DateTime (
const DateTime& src) =
default;
126 constexpr explicit DateTime (
const Date& d)
noexcept;
127 constexpr explicit DateTime (
const DateTime& dt,
const Date& updateDate)
noexcept;
128 constexpr explicit DateTime (
const DateTime& dt,
const TimeOfDay& updateTOD)
noexcept;
129 constexpr DateTime (
const Date& date,
const optional<TimeOfDay>& timeOfDay,
const optional<Timezone>& tz =
Timezone::kUnknown)
noexcept;
130 explicit DateTime (time_t unixEpochTime)
noexcept;
131 explicit DateTime (const ::tm& tmTime,
const optional<Timezone>& tz =
Timezone::kUnknown)
noexcept;
132 explicit DateTime (const ::timespec& tmTime,
const optional<Timezone>& tz =
Timezone::kUnknown)
noexcept;
133#if qStroika_Foundation_Common_Platform_POSIX
134 explicit DateTime (const ::timeval& tmTime,
const optional<Timezone>& tz =
Timezone::kUnknown)
noexcept;
135#elif qStroika_Foundation_Common_Platform_Windows
136 explicit DateTime (const ::SYSTEMTIME& sysTime,
const optional<Timezone>& tz =
Timezone::kLocalTime)
noexcept;
137 explicit DateTime (const ::FILETIME& fileTime,
const optional<Timezone>& tz =
Timezone::kUTC)
noexcept;
139 template <Common::ITimePo
int T>
140 explicit DateTime (T timePoint)
noexcept;
145 nonvirtual DateTime& operator= (DateTime&& rhs)
noexcept =
default;
146 nonvirtual DateTime& operator= (
const DateTime& rhs) =
default;
168 enum class LocaleIndependentFormat {
181 static constexpr auto kISO8601Format = LocaleIndependentFormat::eISO8601;
197 static constexpr auto kRFC1123Format = LocaleIndependentFormat::eRFC1123;
203 static constexpr string_view kLocaleStandardFormat =
"%c"sv;
209 static constexpr string_view kLocaleStandardAlternateFormat =
"%Ec"sv;
225 static constexpr string_view kShortLocaleFormatPattern =
"%x %X"sv;
236 static const Traversal::Iterable<String> kDefaultParseFormats;
239 class FormatException;
262 static DateTime Parse (
const String& rep, LocaleIndependentFormat format);
263 static DateTime Parse (
const String& rep,
const locale& l = locale{});
264 static DateTime Parse (
const String& rep,
const locale& l,
const String& formatPattern);
265 static DateTime Parse (
const String& rep,
const locale& l,
const Traversal::Iterable<String>& formatPatterns);
266 static DateTime Parse (
const String& rep,
const String& formatPattern);
278 static optional<DateTime> ParseQuietly (
const String& rep, LocaleIndependentFormat format,
size_t* consumedCharacters =
nullptr);
279 static optional<DateTime> ParseQuietly (
const String& rep,
const String& formatPattern,
size_t* consumedCharacters =
nullptr);
280 static optional<DateTime> ParseQuietly (
const String& rep,
const locale& l,
const String& formatPattern,
size_t* consumedCharacters =
nullptr);
281 static optional<DateTime> ParseQuietly (
const String& rep,
const locale& l,
const Traversal::Iterable<String>& formatPatterns = kDefaultParseFormats,
282 size_t* consumedCharacters =
nullptr);
286 static optional<DateTime> ParseQuietly_ (
const wstring& rep,
const time_get<wchar_t>& tmget,
const String& formatPattern,
size_t* consumedCharacters);
292 static DateTime Now () noexcept;
300 static DateTime NowUTC () noexcept;
306 static Date GetToday () noexcept;
312 static const DateTime kMin;
318 static const DateTime kMax;
323 nonvirtual constexpr optional<Timezone> GetTimezone () const noexcept;
332 nonvirtual DateTime AsLocalTime () const;
345 nonvirtual DateTime AsUTC () const;
356 nonvirtual DateTime AsTimezone (Timezone tz) const;
362 nonvirtual optional<
bool> IsDaylightSavingsTime () const;
375 enum class NonStandardPrintFormat : uint8_t {
376 eCurrentLocale_WithZerosStripped,
378 eDEFAULT = eCurrentLocale_WithZerosStripped,
384 static constexpr NonStandardPrintFormat eCurrentLocale_WithZerosStripped = NonStandardPrintFormat::eCurrentLocale_WithZerosStripped;
415 nonvirtual String Format (NonStandardPrintFormat pf = NonStandardPrintFormat::eDEFAULT)
const;
416 nonvirtual String Format (LocaleIndependentFormat format)
const;
417 nonvirtual String Format (
const locale& l)
const;
418 nonvirtual String Format (
const locale& l,
const String& formatPattern)
const;
419 nonvirtual String Format (
const String& formatPattern)
const;
425 nonvirtual String
ToString ()
const;
431 nonvirtual Date::JulianDayNumber DaysSince ()
const;
457 template <
typename T>
458 nonvirtual T As () const
460#if !qCompilerAndStdLib_template_requires_doesnt_work_with_specialization_Buggy
461 requires (Common::IAnyOf<T, time_t,
struct tm, struct timespec, Date, Characters::String
462#if qStroika_Foundation_Common_Platform_Windows
467 Common::ITimePoint<T>)
475 nonvirtual constexpr Date GetDate () const noexcept;
487 nonvirtual constexpr optional<TimeOfDay> GetTimeOfDay () const noexcept;
498 nonvirtual DateTime Add (const Duration& d) const;
509 nonvirtual DateTime AddDays (int days) const;
523 nonvirtual DateTime AddSeconds (int64_t seconds) const;
533 nonvirtual Duration Difference (const DateTime& rhs) const;
538 nonvirtual strong_ordering operator<=> (const DateTime& rhs) const;
543 nonvirtual bool operator== (const DateTime& rhs) const;
546 struct ThreeWayComparer;
549 template <typename T>
550 nonvirtual T As_Simple_ () const
551#if !qCompilerAndStdLib_template_requires_doesnt_work_with_specialization_Buggy
552 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>)
555#if qStroika_Foundation_Common_Platform_Windows
556 nonvirtual SYSTEMTIME AsSYSTEMTIME_ () const;
558 template <typename CLOCK_T, typename DURATION_T>
559 nonvirtual time_point<CLOCK_T, DURATION_T> As_TP_ () const;
562 optional<Timezone> fTimezone_;
564 optional<TimeOfDay> fTimeOfDay_;
567 [[deprecated ("Since Stroika v3.0d5 - just use AsLocalTime ().As<Time::TimePointSeconds> ()")]] Time::TimePointSeconds ToTickCount () const
569 return AsLocalTime ().As<Time::TimePointSeconds> ();
571 [[deprecated (
"Since Stroika v3.0d5 - just construct the DateTime with the value of GetTickCount()")]]
static DateTime
572 FromTickCount (Time::TimePointSeconds tickCount)
574 return DateTime{tickCount};
578 class DateTime::FormatException :
public Execution::RuntimeErrorException<> {
586 static const FormatException kThe;
588 inline const DateTime::FormatException DateTime::FormatException::kThe;
590 inline const Traversal::Iterable<String> DateTime::kDefaultParseFormats{
591 kLocaleStandardFormat,
592 kLocaleStandardAlternateFormat,
595 "%Y-%b-%d %H:%M:%S"sv,
604 struct DateTime::ThreeWayComparer : Common::ComparisonRelationDeclarationBase<Common::ComparisonRelationType::eThreeWayCompare> {
607 constexpr ThreeWayComparer (
bool coerceToCommonTimezone =
true);
611 nonvirtual strong_ordering operator() (
const DateTime& lhs,
const DateTime& rhs)
const;
612 bool fCoerceToCommonTimezone;
618 DateTime operator+ (
const DateTime& lhs,
const Duration& rhs);
623 Duration operator- (
const DateTime& lhs,
const DateTime& rhs);
628 DateTime operator- (
const DateTime&,
const Duration& rhs);
629 Duration operator- (
const DateTime&,
const DateTime& rhs);
633namespace Stroika::Foundation::Math {
634 bool NearlyEquals (Time::DateTime l, Time::DateTime r);
635 bool NearlyEquals (Time::DateTime l, Time::DateTime r, Time::DurationSeconds epsilon);
638namespace Stroika::Foundation::Time {
645 struct DefaultOpenness<Time::DateTime> : ExplicitOpenness<Openness::eClosed, Openness::eClosed> {};
647 struct DefaultDifferenceTypes<Time::DateTime> : ExplicitDifferenceTypes<Time::Duration> {};
654 static const Time::DateTime kLowerBound;
655 static const Time::DateTime kUpperBound;
669#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={})