4#ifndef _Stroika_Foundation_Time_Date_h_
5#define _Stroika_Foundation_Time_Date_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
15#include "Stroika/Foundation/Common/Common.h"
17#include "Stroika/Foundation/DataExchange/ValidationStrategy.h"
18#include "Stroika/Foundation/Execution/Exceptions.h"
47namespace Stroika::Foundation::Time {
51 using Characters::String;
57 using chrono::January;
58 using chrono::February;
65 using chrono::September;
66 using chrono::October;
67 using chrono::November;
68 using chrono::December;
71 using chrono::weekday;
76 using chrono::Tuesday;
77 using chrono::Wednesday;
78 using chrono::Thursday;
80 using chrono::Saturday;
88 using chrono::year_month_day;
90 DISABLE_COMPILER_MSC_WARNING_START (4455)
91 using
std::literals::chrono_literals::operator"" d;
92 using
std::literals::chrono_literals::operator"" y;
93 DISABLE_COMPILER_MSC_WARNING_END (4455)
94 using
std::chrono::operator/;
113 [[deprecated (
"Since Stroika v3.0d1, use chrono::Sunday")]]
static constexpr weekday eSunday{Sunday};
114 [[deprecated (
"Since Stroika v3.0d1, use chrono::Monday")]]
static constexpr weekday eMonday{Monday};
115 [[deprecated (
"Since Stroika v3.0d1, use chrono::Tuesday")]]
static constexpr weekday eTuesday{Tuesday};
116 [[deprecated (
"Since Stroika v3.0d1, use chrono::Wednesday")]]
static constexpr weekday eWednesday{Wednesday};
117 [[deprecated (
"Since Stroika v3.0d1, use chrono::Thursday")]]
static constexpr weekday eThursday{Thursday};
118 [[deprecated (
"Since Stroika v3.0d1, use chrono::Friday")]]
static constexpr weekday eFriday{Friday};
119 [[deprecated (
"Since Stroika v3.0d1, use chrono::Saturday")]]
static constexpr weekday eSaturday{Saturday};
139 [[deprecated (
"Since Stroika v3.0d1, use chrono::January")]]
static constexpr chrono::month eJanuary{January};
140 [[deprecated (
"Since Stroika v3.0d1, use chrono::February")]]
static constexpr chrono::month eFebruary{February};
141 [[deprecated (
"Since Stroika v3.0d1, use chrono::March")]]
static constexpr chrono::month eMarch{March};
142 [[deprecated (
"Since Stroika v3.0d1, use chrono::April")]]
static constexpr chrono::month eApril{April};
143 [[deprecated (
"Since Stroika v3.0d1, use chrono::May")]]
static constexpr chrono::month eMay{May};
144 [[deprecated (
"Since Stroika v3.0d1, use chrono::June")]]
static constexpr chrono::month eJune{June};
145 [[deprecated (
"Since Stroika v3.0d1, use chrono::July")]]
static constexpr chrono::month eJuly{July};
146 [[deprecated (
"Since Stroika v3.0d1, use chrono::August")]]
static constexpr chrono::month eAugust{August};
147 [[deprecated (
"Since Stroika v3.0d1, use chrono::September")]]
static constexpr chrono::month eSeptember{September};
148 [[deprecated (
"Since Stroika v3.0d1, use chrono::October")]]
static constexpr chrono::month eOctober{October};
149 [[deprecated (
"Since Stroika v3.0d1, use chrono::November")]]
static constexpr chrono::month eNovember{November};
150 [[deprecated (
"Since Stroika v3.0d1, use chrono::December")]]
static constexpr chrono::month eDecember{December};
171 [[deprecated (
"Since Stroika v3.0d1, use day{1} or 1d")]]
static constexpr day e1{1};
172 [[deprecated (
"Since Stroika v3.0d1, use day{2} or 2d")]]
static constexpr day e2{2};
173 [[deprecated (
"Since Stroika v3.0d1, use day{3}")]]
static constexpr day e3{3};
174 [[deprecated (
"Since Stroika v3.0d1, use day{4}")]]
static constexpr day e4{4};
175 [[deprecated (
"Since Stroika v3.0d1, use day{5}")]]
static constexpr day e5{5};
176 [[deprecated (
"Since Stroika v3.0d1, use day{6}")]]
static constexpr day e6{6};
177 [[deprecated (
"Since Stroika v3.0d1, use day{7}")]]
static constexpr day e7{7};
178 [[deprecated (
"Since Stroika v3.0d1, use day{8}")]]
static constexpr day e8{8};
179 [[deprecated (
"Since Stroika v3.0d1, use day{9}")]]
static constexpr day e9{9};
180 [[deprecated (
"Since Stroika v3.0d1, use day{10}")]]
static constexpr day e10{10};
181 [[deprecated (
"Since Stroika v3.0d1, use day{11}")]]
static constexpr day e11{11};
182 [[deprecated (
"Since Stroika v3.0d1, use day{12}")]]
static constexpr day e12{12};
183 [[deprecated (
"Since Stroika v3.0d1, use day{13}")]]
static constexpr day e13{13};
184 [[deprecated (
"Since Stroika v3.0d1, use day{14}")]]
static constexpr day e14{14};
185 [[deprecated (
"Since Stroika v3.0d1, use day{15}")]]
static constexpr day e15{15};
186 [[deprecated (
"Since Stroika v3.0d1, use day{16}")]]
static constexpr day e16{16};
187 [[deprecated (
"Since Stroika v3.0d1, use day{17}")]]
static constexpr day e17{17};
188 [[deprecated (
"Since Stroika v3.0d1, use day{18}")]]
static constexpr day e18{18};
189 [[deprecated (
"Since Stroika v3.0d1, use day{19}")]]
static constexpr day e19{19};
190 [[deprecated (
"Since Stroika v3.0d1, use day{20}")]]
static constexpr day e20{20};
191 [[deprecated (
"Since Stroika v3.0d1, use day{21}")]]
static constexpr day e21{21};
192 [[deprecated (
"Since Stroika v3.0d1, use day{22}")]]
static constexpr day e22{22};
193 [[deprecated (
"Since Stroika v3.0d1, use day{23}")]]
static constexpr day e23{23};
194 [[deprecated (
"Since Stroika v3.0d1, use day{24}")]]
static constexpr day e24{24};
195 [[deprecated (
"Since Stroika v3.0d1, use day{25}")]]
static constexpr day e25{25};
196 [[deprecated (
"Since Stroika v3.0d1, use day{26}")]]
static constexpr day e26{26};
197 [[deprecated (
"Since Stroika v3.0d1, use day{27}")]]
static constexpr day e27{27};
198 [[deprecated (
"Since Stroika v3.0d1, use day{28}")]]
static constexpr day e28{28};
199 [[deprecated (
"Since Stroika v3.0d1, use day{29}")]]
static constexpr day e29{29};
200 [[deprecated (
"Since Stroika v3.0d1, use day{30}")]]
static constexpr day e30{30};
201 [[deprecated (
"Since Stroika v3.0d1, use day{31}")]]
static constexpr day e31{31};
253 static constexpr bool kLocaleClassic_Write4DigitYear =
false;
254 static constexpr bool kLocaleENUS_Write4DigitYear =
257#elif defined(_GLIBCXX_RELEASE)
259#elif defined(_LIBCPP_VERSION)
334 using JulianDayNumber = uint32_t;
352 JulianDayNumber fJulianRep;
393 constexpr static JulianDayNumber
ToJulianRep (month m, day d, year y,
395 constexpr static JulianDayNumber
403 constexpr static year_month_day
422 class FormatException;
436 constexpr Date (
const Date& src)
noexcept =
default;
437 explicit constexpr Date (JulianDayNumber julianRep,
445 nonvirtual
Date& operator= (
Date&& rhs)
noexcept =
default;
446 nonvirtual
Date& operator= (
const Date& rhs) =
default;
516 static Date Parse (
const String& rep,
const locale& l,
size_t* consumedCharsInStringUpTo);
518 static Date Parse (
const String& rep,
const locale& l,
const String& formatPattern,
size_t* consumedCharsInStringUpTo);
522 static Date Parse (
const String& rep,
const String& formatPattern,
size_t* consumedCharsInStringUpTo);
534 static optional<Date> ParseQuietly_ (
const wstring& rep,
const time_get<wchar_t>& tmget,
const String& formatPattern,
535 size_t* consumedCharsInStringUpTo);
555 nonvirtual
constexpr year GetYear ()
const;
560 nonvirtual
constexpr month GetMonth ()
const;
565 nonvirtual
constexpr day GetDayOfMonth ()
const;
570 nonvirtual weekday GetDayOfWeek ()
const;
576 nonvirtual
constexpr JulianDayNumber
GetJulianRep ()
const;
590 eCurrentLocale_WithZerosStripped,
592 eDEFAULT = eCurrentLocale_WithZerosStripped,
598 static constexpr NonStandardPrintFormat eCurrentLocale_WithZerosStripped = NonStandardPrintFormat::eCurrentLocale_WithZerosStripped;
629 nonvirtual [[nodiscard]]
Date Add (
int d)
const;
630 nonvirtual [[nodiscard]]
Date Add (days d)
const;
638 static days Since (
Date dStart,
Date dEnd);
639 nonvirtual days Since ()
const;
679 constexpr strong_ordering operator<=> (
const Date& rhs)
const =
default;
692 template <
typename T>
693 constexpr T
As () const
694 requires (Common::IAnyOf<::tm, tm, year_month_day> or Common::ITimePoint<T>);
697 using JulianRepType [[deprecated ("Since Stroika v3.0d1 - use JulianDayNumber")]] = JulianDayNumber;
699 [[deprecated ("Since Stroika v3.0d1 - use.
Add () - now
Date immutable")]]
Date& operator++ ()
704 [[deprecated (
"Since Stroika v3.0d1 - use.Add () - now Date immutable")]] Date operator++ (
int)
708 [[deprecated (
"Since Stroika v3.0d1, use As<year_month_day> ()")]]
void mdy (month* m, day* d, year* y)
const
717 [[deprecated (
"Since Stroika v3.0d1 - use Add(days)")]] Date AddDays (
SignedJulianDayNumber dayCount)
const
719 return Add (chrono::days{dayCount});
721 [[deprecated (
"Since Stroika 3.0d1 - use Since")]] JulianDayNumber DaysSince ()
const
723 return static_cast<JulianDayNumber
> (
Since ().count ());
727 static optional<Date> LocaleFreeParseQuietly_kMonthDayYearFormat_ (
const wstring& rep,
size_t* consumedCharsInStringUpTo);
730 static constexpr int kTM_Year_RelativeToYear_{1900};
733 static Date AsDate_ (const ::tm& when);
736 year_month_day fRep_;
738 static_assert (
sizeof (Date) ==
sizeof (year_month_day));
739 static_assert (totally_ordered<Date>);
741 class Date::FormatException :
public Execution::RuntimeErrorException<> {
748 static const FormatException kThe;
750 inline const Date::FormatException Date::FormatException::kThe;
752 kLocaleStandardFormat,
753 kLocaleStandardAlternateFormat,
759 int YearDifference (
const Date& lhs,
const Date& rhs);
760 float YearDifferenceF (
const Date& lhs,
const Date& rhs);
762 String GetFormattedAge (
const optional<Date>& birthDate,
const optional<Date>& deathDate = {});
763 String GetFormattedAgeWithUnit (
const optional<Date>& birthDate,
const optional<Date>& deathDate = {},
bool abbrevUnit =
true);
770 struct DefaultOpenness<Time::Date> : ExplicitOpenness<Openness::eClosed, Openness::eClosed> {};
772 struct DefaultDifferenceTypes<Time::Date> : ExplicitDifferenceTypes<chrono::days> {};
774 struct Default<Time::Date> : ExplicitOpennessAndDifferenceType<Time::Date> {
775 static const Time::Date kLowerBound;
776 static const Time::Date kUpperBound;
778 static Time::Date GetNext (Time::Date n);
779 static Time::Date GetPrevious (Time::Date n);
781 static size_t DifferenceToSizeT (chrono::days s)
783 return size_t (s.count ());
#define RequireNotNull(p)
#define Stroika_Define_Enum_Bounds(FIRST_ITEM, LAST_ITEM)
String is like std::u32string, except it is much easier to use, often much more space efficient,...
nonvirtual days Difference(const Date &rhs) const
Returns the difference (*this - rhs) between the two Date records;.
nonvirtual String Format(NonStandardPrintFormat pf=NonStandardPrintFormat::eDEFAULT) const
NonStandardPrintFormat
DisplayFormat is a representation which a date can be transformed in and out of.
nonvirtual days operator-(const Date &rhs) const
make_signed_t< JulianDayNumber > SignedJulianDayNumber
nonvirtual Date operator+(int daysOffset) const
Syntactic sure for Add (n);.
static constexpr string_view kISO8601Format
Y-M-D format - locale independent, and ISO-8601 date format standard.
static constexpr ReferencePoint kGregorianCalendarEpoch
static optional< Date > ParseQuietly(const String &rep, const String &formatPattern)
like Parse(), but returns nullopt on parse error, not throwing exception. if locale is missing,...
static Date Now() noexcept
static const JulianDayNumber kMinJulianRep
static constexpr ReferencePoint kUNIXEpoch
static const JulianDayNumber kMaxJulianRep
static constexpr ReferencePoint kMinDateReference
static Date Parse(const String &rep, const locale &l=locale{})
nonvirtual String ToString() const
static constexpr JulianDayNumber ToJulianRep(month m, day d, year y, DataExchange::ValidationStrategy validationStrategy=DataExchange::ValidationStrategy::eAssertion)
static constexpr ReferencePoint kStartOfJulianCalendar
static constexpr year_month_day FromJulianRep(JulianDayNumber j, DataExchange::ValidationStrategy validationStrategy=DataExchange::ValidationStrategy::eAssertion)
static constexpr string_view kLocaleStandardAlternateFormat
static days Since(Date dStart, Date dEnd)
static constexpr string_view kMonthDayYearFormat
classic (american) month-day-year format, but unlike D, this uses Y, so the 4-digit form of year
nonvirtual constexpr JulianDayNumber GetJulianRep() const
return the Julian Day Number (JDN) - corresponding to this date object (https://en....
constexpr Date(Date &&src) noexcept=default
static constexpr string_view kLocaleStandardFormat
static const Traversal::Iterable< String > kDefaultParseFormats
nonvirtual Date Add(int d) const
Duration is a chrono::duration<double> (=.
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
Simple wrapper on std::chrono::day, with some helpful validation properties (assures constructed 'ok'...
Simple wrapper on std::chrono::weekday, with some helpful validation properties (assures constructed ...
Simple wrapper on std::chrono::month, with some helpful validation properties (assures constructed 'o...
this defines undefined but important properties of the x (read/write date) format string in stdc++ ti...
Simple wrapper on std::chrono::year, with some helpful validation properties (assures constructed 'ok...
static constexpr year eFirstYear
4713 BC (no year zero)
static constexpr year eLastYear