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