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 using std::literals::chrono_literals::operator
""d;
91 using std::literals::chrono_literals::operator
""y;
92 using std::chrono::operator/;
111 [[deprecated (
"Since Stroika v3.0d1, use chrono::Sunday")]]
static constexpr weekday eSunday{Sunday};
112 [[deprecated (
"Since Stroika v3.0d1, use chrono::Monday")]]
static constexpr weekday eMonday{Monday};
113 [[deprecated (
"Since Stroika v3.0d1, use chrono::Tuesday")]]
static constexpr weekday eTuesday{Tuesday};
114 [[deprecated (
"Since Stroika v3.0d1, use chrono::Wednesday")]]
static constexpr weekday eWednesday{Wednesday};
115 [[deprecated (
"Since Stroika v3.0d1, use chrono::Thursday")]]
static constexpr weekday eThursday{Thursday};
116 [[deprecated (
"Since Stroika v3.0d1, use chrono::Friday")]]
static constexpr weekday eFriday{Friday};
117 [[deprecated (
"Since Stroika v3.0d1, use chrono::Saturday")]]
static constexpr weekday eSaturday{Saturday};
137 [[deprecated (
"Since Stroika v3.0d1, use chrono::January")]]
static constexpr chrono::month eJanuary{January};
138 [[deprecated (
"Since Stroika v3.0d1, use chrono::February")]]
static constexpr chrono::month eFebruary{February};
139 [[deprecated (
"Since Stroika v3.0d1, use chrono::March")]]
static constexpr chrono::month eMarch{March};
140 [[deprecated (
"Since Stroika v3.0d1, use chrono::April")]]
static constexpr chrono::month eApril{April};
141 [[deprecated (
"Since Stroika v3.0d1, use chrono::May")]]
static constexpr chrono::month eMay{May};
142 [[deprecated (
"Since Stroika v3.0d1, use chrono::June")]]
static constexpr chrono::month eJune{June};
143 [[deprecated (
"Since Stroika v3.0d1, use chrono::July")]]
static constexpr chrono::month eJuly{July};
144 [[deprecated (
"Since Stroika v3.0d1, use chrono::August")]]
static constexpr chrono::month eAugust{August};
145 [[deprecated (
"Since Stroika v3.0d1, use chrono::September")]]
static constexpr chrono::month eSeptember{September};
146 [[deprecated (
"Since Stroika v3.0d1, use chrono::October")]]
static constexpr chrono::month eOctober{October};
147 [[deprecated (
"Since Stroika v3.0d1, use chrono::November")]]
static constexpr chrono::month eNovember{November};
148 [[deprecated (
"Since Stroika v3.0d1, use chrono::December")]]
static constexpr chrono::month eDecember{December};
169 [[deprecated (
"Since Stroika v3.0d1, use day{1} or 1d")]]
static constexpr day e1{1};
170 [[deprecated (
"Since Stroika v3.0d1, use day{2} or 2d")]]
static constexpr day e2{2};
171 [[deprecated (
"Since Stroika v3.0d1, use day{3}")]]
static constexpr day e3{3};
172 [[deprecated (
"Since Stroika v3.0d1, use day{4}")]]
static constexpr day e4{4};
173 [[deprecated (
"Since Stroika v3.0d1, use day{5}")]]
static constexpr day e5{5};
174 [[deprecated (
"Since Stroika v3.0d1, use day{6}")]]
static constexpr day e6{6};
175 [[deprecated (
"Since Stroika v3.0d1, use day{7}")]]
static constexpr day e7{7};
176 [[deprecated (
"Since Stroika v3.0d1, use day{8}")]]
static constexpr day e8{8};
177 [[deprecated (
"Since Stroika v3.0d1, use day{9}")]]
static constexpr day e9{9};
178 [[deprecated (
"Since Stroika v3.0d1, use day{10}")]]
static constexpr day e10{10};
179 [[deprecated (
"Since Stroika v3.0d1, use day{11}")]]
static constexpr day e11{11};
180 [[deprecated (
"Since Stroika v3.0d1, use day{12}")]]
static constexpr day e12{12};
181 [[deprecated (
"Since Stroika v3.0d1, use day{13}")]]
static constexpr day e13{13};
182 [[deprecated (
"Since Stroika v3.0d1, use day{14}")]]
static constexpr day e14{14};
183 [[deprecated (
"Since Stroika v3.0d1, use day{15}")]]
static constexpr day e15{15};
184 [[deprecated (
"Since Stroika v3.0d1, use day{16}")]]
static constexpr day e16{16};
185 [[deprecated (
"Since Stroika v3.0d1, use day{17}")]]
static constexpr day e17{17};
186 [[deprecated (
"Since Stroika v3.0d1, use day{18}")]]
static constexpr day e18{18};
187 [[deprecated (
"Since Stroika v3.0d1, use day{19}")]]
static constexpr day e19{19};
188 [[deprecated (
"Since Stroika v3.0d1, use day{20}")]]
static constexpr day e20{20};
189 [[deprecated (
"Since Stroika v3.0d1, use day{21}")]]
static constexpr day e21{21};
190 [[deprecated (
"Since Stroika v3.0d1, use day{22}")]]
static constexpr day e22{22};
191 [[deprecated (
"Since Stroika v3.0d1, use day{23}")]]
static constexpr day e23{23};
192 [[deprecated (
"Since Stroika v3.0d1, use day{24}")]]
static constexpr day e24{24};
193 [[deprecated (
"Since Stroika v3.0d1, use day{25}")]]
static constexpr day e25{25};
194 [[deprecated (
"Since Stroika v3.0d1, use day{26}")]]
static constexpr day e26{26};
195 [[deprecated (
"Since Stroika v3.0d1, use day{27}")]]
static constexpr day e27{27};
196 [[deprecated (
"Since Stroika v3.0d1, use day{28}")]]
static constexpr day e28{28};
197 [[deprecated (
"Since Stroika v3.0d1, use day{29}")]]
static constexpr day e29{29};
198 [[deprecated (
"Since Stroika v3.0d1, use day{30}")]]
static constexpr day e30{30};
199 [[deprecated (
"Since Stroika v3.0d1, use day{31}")]]
static constexpr day e31{31};
251 static constexpr bool kLocaleClassic_Write4DigitYear =
false;
252 static constexpr bool kLocaleENUS_Write4DigitYear =
255#elif defined(_GLIBCXX_RELEASE)
257#elif defined(_LIBCPP_VERSION)
350 JulianDayNumber fJulianRep;
391 constexpr static JulianDayNumber
ToJulianRep (month m, day d, year y,
393 constexpr static JulianDayNumber
401 constexpr static year_month_day
420 class FormatException;
434 constexpr Date (
const Date&
src)
noexcept =
default;
443 nonvirtual
Date& operator= (
Date&&
rhs)
noexcept =
default;
444 nonvirtual
Date& operator= (
const Date&
rhs) =
default;
553 nonvirtual
constexpr year GetYear ()
const;
558 nonvirtual
constexpr month GetMonth ()
const;
563 nonvirtual
constexpr day GetDayOfMonth ()
const;
568 nonvirtual weekday GetDayOfWeek ()
const;
574 nonvirtual
constexpr JulianDayNumber
GetJulianRep ()
const;
588 eCurrentLocale_WithZerosStripped,
590 eDEFAULT = eCurrentLocale_WithZerosStripped,
596 static constexpr NonStandardPrintFormat eCurrentLocale_WithZerosStripped = NonStandardPrintFormat::eCurrentLocale_WithZerosStripped;
637 nonvirtual days Since ()
const;
690 template <
typename T>
692 requires (Common::IAnyOf<::
tm,
tm, year_month_day>
or Common::ITimePoint<T>);
702 [[
deprecated (
"Since Stroika v3.0d1 - use.Add () - now Date immutable")]] Date operator++ (
int)
706 [[
deprecated (
"Since Stroika v3.0d1, use As<year_month_day> ()")]]
void mdy (month* m, day* d, year* y)
const
719 [[
deprecated (
"Since Stroika 3.0d1 - use Since")]] JulianDayNumber DaysSince ()
const
721 return static_cast<JulianDayNumber
> (
Since ().count ());
728 static constexpr int kTM_Year_RelativeToYear_{1900};
731 static Date AsDate_ (const ::tm&
when);
734 year_month_day fRep_;
736 static_assert (
sizeof (Date) ==
sizeof (year_month_day));
737 static_assert (totally_ordered<Date>);
739 class Date::FormatException :
public Execution::RuntimeErrorException<> {
746 static const FormatException kThe;
748 inline const Date::FormatException Date::FormatException::kThe;
750 kLocaleStandardFormat,
751 kLocaleStandardAlternateFormat,
757 int YearDifference (
const Date& lhs,
const Date& rhs);
758 float YearDifferenceF (
const Date& lhs,
const Date& rhs);
760 String GetFormattedAge (
const optional<Date>& birthDate,
const optional<Date>& deathDate = {});
761 String GetFormattedAgeWithUnit (
const optional<Date>& birthDate,
const optional<Date>& deathDate = {},
bool abbrevUnit =
true);
768 struct DefaultOpenness<Time::Date> : ExplicitOpenness<Openness::eClosed, Openness::eClosed> {};
770 struct DefaultDifferenceTypes<Time::Date> : ExplicitDifferenceTypes<chrono::days> {};
772 struct Default<Time::Date> : ExplicitOpennessAndDifferenceType<Time::Date> {
773 static const Time::Date kLowerBound;
774 static const Time::Date kUpperBound;
776 static Time::Date GetNext (Time::Date n);
777 static Time::Date GetPrevious (Time::Date n);
779 static size_t DifferenceToSizeT (chrono::days s)
781 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