Date and Time
Date and Time Types
Introduction
The time namespace provides types for working with civil dates, wall-clock times, and time spans.
Calendar and clock parts are bounded labels; the aggregate result structures name related fields.
Part/amount conversion uses offsets from the part’s minimum label, and numeric range checks do not validate calendar
combinations.
See Working with Calendar and Time Parts for construction, numbering, contextual validation, navigation,
weekday selection, ordinal conversion, and field reconstruction.
Date
Date represents a proleptic Gregorian calendar date in
0000-01-01..9999-12-31, with Core epoch 0000-01-01.
Default construction is invalid; invalid dates compare equal and sort before valid dates.
Construction validates calendar combinations, and day, month, and year arithmetic offers saturating and throwing forms.
See Working with Dates for construction choices, validation, field extraction, conversions,
month-end adjustment, navigation, and boundary handling.
Date Time
DateTime retains a UTC instant plus resolved display-offset or named-zone metadata.
It shares the date range 0000-01-01..9999-12-31 and retains nanosecond fractions.
Ordering compares UTC instants; equality also compares display metadata.
Tick conversion accepts nonnegative seconds, milliseconds, microseconds, or nanoseconds relative to TimeEpoch and
truncates smaller fractions; split seconds/fractions retain full precision.
Arithmetic applies Duration or CalendarDelta in UTC, with saturating, throwing, and overflow-test variants.
The distance APIs use whole-second epoch readings; convert to Timestamp for precise checked distances.
See Working with DateTime Values for construction, field extraction, zone resolution, conversion, and
calculations, including folds, gaps, and local recurrences.
TimeWithZone retains a daily wall-clock reading with its intended zone.
Default construction is midnight UTC; equality compares the stored reading and zone.
It identifies an instant only after DateTime resolves it with a local date and, when needed, a fold occurrence.
See Keeping a Wall-Clock Time with Its Zone for construction, accessors, compact output, transition
handling, and local recurrences.
Time
Time represents a daily clock reading in
00:00:00..23:59:59.999999999.
Default construction is midnight; there is no invalid sentinel, date, or zone.
TimeParts names its component fields.
Wrapping addition accepts Duration or TimeDelta and either returns a signed day carry or a
TimeWrapResult containing the new time and carry.
See Working with Times for construction, comparisons, precision-preserving conversions, and
calculations across midnight.
Time Zone
TimeZone represents UTC, a normalized fixed offset, or a supported named IANA zone.
Name lookup returns std::optional or throws err::ParseError; aliases resolve to the primary zone.
Component construction clamps each signed component; total-duration construction removes complete 24-hour rotations.
staticOffset() returns zero for named zones; DateTime::timeOffset() supplies an instant’s resolved shift.
Equality includes zone identity and local origin.
local() caches the system’s base zone for the process lifetime, falling back to local-marked UTC.
Named-zone offsets still resolve per date using the bundled IANA rules identified by databaseVersion().
Local origin is preserved by copies/arithmetic and replaced by the target marker on conversion.
Default local-origin display omits the zone; explicit ISO TimeShift output includes the resolved shift.
TimeOccurrenceInFold selects the earlier (default First) or later
(Second) UTC match for repeated local readings.
Gap construction follows the database’s transition rule and can retain display metadata that differs from the selected
instant’s refreshed zone metadata; isValid() does not detect skipped readings.
TimeZoneId and tz::TimeOffset::abbreviationId() are transient database indexes.
tz::TimeOffset holds offset seconds, zone/DST/abbreviation metadata,
and local origin; its constructors do not resolve named-zone rules.
See Working with Time Zones for zone selection, lookup, conversion, transition resolution,
system-local behavior, persistence choices, detail values, and rule-version queries.
ISO Date and Time Output
IsoTimeFormatFlags combines
IsoTimeFormat flags for Date, Time, and DateTime ISO output.
DateTimePrecision controls the last emitted field or fractional digit.
Defaults use extended fields, whole seconds for time output, and a space without an offset for combined output.
See Customizing ISO Date and Time Output for every flag, precision level, and option interaction.
Timestamp uses its own fixed canonical UTC output; see UTC Timestamps.
Duration and Time Amounts
Introduction
Duration and time span types store signed time intervals at different resolutions.
<erbsland/time/TimeUnitTags.hpp> declares SecondsUnitTag,
MonthsUnitTag, and
YearsUnitTag for the dimensions of time amount types.
Time amounts from Nanoseconds through
Years are signed 64-bit IntegerAmount aliases.
Fixed units through weeks share a seconds dimension; months and years each have their own unit tag.
Compatible conversions truncate toward zero and offer saturating, overflow-test, and throwing forms.
See Working with Typed Time Amounts for unit selection, construction, conversion, arithmetic, and
calendar application.
The integer suffixes in <erbsland/time/Literals.hpp> produce typed amounts in erbsland::time::literals and
saturate oversized unsigned literal inputs to the signed maximum.
See Writing Time Values with Literals for scope, suffix types, expressions, and precision limits.
Duration stores a signed 64-bit span in whole seconds, with saturating arithmetic
and signed component extraction controlled by DurationPart.
Sub-second inputs truncate toward zero; conversion to TimeDelta offers saturating, overflow-test, and throwing
forms.
See Working with Whole-Second Durations for construction, comparisons, both split-result structures, chrono
interoperability, and precision/range tradeoffs.
TimeDelta stores a signed nanosecond interval with saturating arithmetic.
Whole-unit conversions truncate toward zero; division by zero terminates.
See Working with Precise Time Intervals for construction, checked factories, ratios, endpoint behavior,
chrono interoperability, and exact versus approximate conversions.
CalendarDelta stores nanoseconds through years as independent signed
components, with component equality and saturating component arithmetic.
Application to DateTime runs from nanoseconds through years in UTC and retains the display zone.
Fixed conversion requires zero month/year parts and representable components and intermediate sums;
isValidTimeDelta() tests conversion success.
See Understanding Calendar Changes for composition, application order, month-end clamping,
local recurrences, boundary handling, and fixed conversion.
TimeDeltaFormat controls fixed and calendar interval presentation.
It provides short, long, and ELCL presets, custom separators, a smallest fixed unit, and truncating fractional output.
See Customizing Time Interval Output for every option, precision interactions, zero and sign
handling, calendar normalization, and ELCL serialization.
Measuring Elapsed Time
ElapsedTimer starts a monotonic measurement on construction.
elapsed() returns a cumulative TimeDelta; restart() replaces the starting point and returns no interval.
Copies retain the starting point and can be restarted independently.
See Measuring Elapsed Time for operation timing, phase measurements, time budgets, and
interpretation of clock precision and measurement noise.
TimePoint wraps a std::chrono::steady_clock::time_point.
Default construction selects the clock epoch; now() captures a reading and inFuture() offsets one from now.
Subtraction returns signed intervals, comparison orders points, and toStdTimePoint() preserves the clock domain.
Point offsets and differences must stay within the underlying clock’s representable range; point arithmetic does not
saturate.
See Working with Monotonic Time Points for checkpoints, interval direction, deadlines,
clock-domain boundaries, and standard library interoperability.
Throwing epoch factories report negative ticks and invalid fractions with OutOfRangeError.
Their non-throwing counterparts return no value.
Interface
-
class CalendarDelta
A non-normalized delta composed from independent fixed and calendar amounts.
See: Date and Time
Public Types
-
using Parts = CalendarDeltaParts
Alias for all independently stored delta parts.
Public Functions
-
template<typename tAmount>
inline CalendarDelta(tAmount amount) noexcept Create a calendar delta containing one amount.
-
CalendarDelta operator+(CalendarDelta other) const noexcept
Add
otherto this delta.
-
CalendarDelta &operator+=(CalendarDelta other) noexcept
Add
otherto this delta in place.
-
CalendarDelta operator-(CalendarDelta other) const noexcept
Subtract
otherfrom this delta.
-
CalendarDelta &operator-=(CalendarDelta other) noexcept
Subtract
otherfrom this delta in place.
-
CalendarDelta operator-() const noexcept
Negate every part of this delta.
-
bool isZero() const noexcept
Test whether every part is zero.
-
bool isValidTimeDelta() const noexcept
Test whether this delta contains no calendar-dependent units.
-
inline constexpr Nanoseconds nanoseconds() const noexcept
Access the nanosecond part.
-
CalendarDelta &setNanoseconds(Nanoseconds value) noexcept
Set the nanosecond part.
-
inline constexpr Microseconds microseconds() const noexcept
Access the microsecond part.
-
CalendarDelta &setMicroseconds(Microseconds value) noexcept
Set the microsecond part.
-
inline constexpr Milliseconds milliseconds() const noexcept
Access the millisecond part.
-
CalendarDelta &setMilliseconds(Milliseconds value) noexcept
Set the millisecond part.
-
CalendarDelta &setSeconds(Seconds value) noexcept
Set the second part.
-
CalendarDelta &setMinutes(Minutes value) noexcept
Set the minute part.
-
CalendarDelta &setHours(Hours value) noexcept
Set the hour part.
-
CalendarDelta &setDays(Days value) noexcept
Set the day part.
-
CalendarDelta &setWeeks(Weeks value) noexcept
Set the week part.
-
CalendarDelta &setMonths(Months value) noexcept
Set the month part.
-
CalendarDelta &setYears(Years value) noexcept
Set the year part.
-
std::optional<TimeDelta> toTimeDelta() const noexcept
Convert to a fixed TimeDelta if all parts can be represented exactly.
-
TimeDelta toTimeDeltaOrThrow() const
Convert to a fixed TimeDelta.
- Throws:
err::OverflowError – if calendar units are present or the fixed sum exceeds TimeDelta bounds.
-
text::String toString(const TimeDeltaFormat &format = {}) const
Convert this value to text.
-
using Parts = CalendarDeltaParts
-
struct CalendarDeltaParts
Store all independently configurable calendar-delta parts.
Public Members
-
Nanoseconds nanoseconds
The nanosecond part.
-
Microseconds microseconds
The microsecond part.
-
Milliseconds milliseconds
The millisecond part.
-
Nanoseconds nanoseconds
-
struct YearDayOfYearParts
A year and a zero-based day-of-year amount.
Used by calendar extraction helpers that split an epoch day count into the containing year and the remaining day offset within that year.
-
struct YearMonthParts
A year and month pair.
Used by month navigation helpers that may cross a year boundary.
-
struct MonthDayParts
A month and day pair.
Used by calendar extraction helpers that resolve a day-of-year value into month and day components.
-
struct DateParts
A calendar date split into named parts.
-
class Date
A date in the proleptic Gregorian calendar using
0000-01-01as epoch.Supports years 0-9999. Invalid dates are represented by a special internal value and sort before all valid dates in comparisons.
See: Date and Time
Public Functions
-
Date() noexcept = default
Create an invalid date.
-
Date(Year year, Month month, Day day) noexcept
Create a date from parts, or an invalid date if the parts do not exist.
The year, month and day part types clamp their raw construction input first. The resulting combination is then checked as a real calendar date; for example, February 31st becomes an invalid date.
- Parameters:
year – The year.
month – The month.
day – The day.
-
Date(Day day, Month month, Year year) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
-
Date(Year year, Day day, Month month) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
-
std::strong_ordering operator<=>(const Date &other) const noexcept = default
Compare dates. Invalid dates sort before valid dates.
-
inline constexpr bool isValid() const noexcept
Test if this date is valid.
- Returns:
trueif the date represents a real calendar date.
-
bool isFirst() const noexcept
Test if this is the first valid date (epoch).
- Returns:
trueif this is0000-01-01.
-
bool isLast() const noexcept
Test if this is the last valid date (9999-12-31).
- Returns:
trueif this is the maximum supported date.
-
bool wouldAddSaturate(Days days) const
Test if adding the given number of days would saturate the date to the first/last valid date.
The method only returns
trueif the date is clamped to the first or last valid date, not if it ends naturally on the first or last day of the year. Returnsfalsefor invalid dates.- Parameters:
days – The number of days to add.
- Returns:
trueif the date would saturate to the first or last valid date.
-
bool wouldAddSaturate(Months months) const
Test if adding months would saturate the date to the first/last valid date.
Returns
falsefor invalid dates.- Parameters:
months – The number of months to add.
- Returns:
trueif the date would saturate to the first or last valid date.
-
bool wouldAddSaturate(Years years) const
Test if adding years would saturate the date to the first/last valid date.
Returns
falsefor invalid dates.- Parameters:
years – The number of years to add.
- Returns:
trueif the date would saturate to the first or last valid date.
-
Month month() const noexcept
Get the month, or January for invalid dates.
- Returns:
The month component.
-
DayOfYear dayOfYear() const noexcept
Get the one-based day of year.
- Returns:
The day of year (1-366).
-
DayOfWeek dayOfWeek() const noexcept
Get the day of week.
- Returns:
The day of week (Monday - Sunday).
-
DateParts parts() const noexcept
Get all date parts.
For invalid dates, returns
0000-01-01, matching the individual accessors.- Returns:
Named year, month, and day parts.
-
Date added(Days amount) const noexcept
Return this date plus
amountdays, clamped to valid bounds.Invalid dates stay invalid.
- Parameters:
amount – The number of days to add.
- Returns:
The resulting date.
-
Date addedOrThrow(Days amount) const
Return this date plus
amountdays.Invalid dates stay invalid.
- Parameters:
amount – The number of days to add.
- Throws:
err::OverflowError – if the result would be outside the supported date range.
- Returns:
The resulting date.
-
Date added(Months amount) const noexcept
Return this date plus
amountmonths, clamped to valid bounds.Invalid dates stay invalid. A day is clamped to the largest possible day of the resulting month.
- Parameters:
amount – The number of months to add.
- Returns:
The resulting date.
-
Date addedOrThrow(Months amount) const
Return this date plus
amountmonths.Invalid dates stay invalid. A day is clamped to the largest possible day of the resulting month.
- Parameters:
amount – The number of months to add.
- Throws:
err::OverflowError – if the result would be outside the supported date range.
- Returns:
The resulting date.
-
Date added(Years amount) const noexcept
Return this date plus
amountyears, clamped to valid bounds.Invalid dates stay invalid.
- Parameters:
amount – The number of years to add.
- Returns:
The resulting date.
-
Date addedOrThrow(Years amount) const
Return this date plus
amountyears.Invalid dates stay invalid.
- Parameters:
amount – The number of years to add.
- Throws:
err::OverflowError – if the result would be outside the supported date range.
- Returns:
The resulting date.
-
void addOrThrow(Days amount)
Add days in place.
- Parameters:
amount – The number of days to add.
- Throws:
err::OverflowError – if the result would be outside the supported date range.
-
void add(Months amount) noexcept
Add months in place.
A day is clamped to the largest possible day of the resulting month.
- Parameters:
amount – The number of months to add.
-
void addOrThrow(Months amount)
Add months in place.
A day is clamped to the largest possible day of the resulting month.
- Parameters:
amount – The number of months to add.
- Throws:
err::OverflowError – if the result would be outside the supported date range.
-
void add(Years amount) noexcept
Add years in place.
- Parameters:
amount – The number of years to add.
-
void addOrThrow(Years amount)
Add years in place.
- Parameters:
amount – The number of years to add.
- Throws:
err::OverflowError – if the result would be outside the supported date range.
-
Date next() const noexcept
Return the following date, or invalid past the supported range.
- Returns:
The next calendar day.
-
Date previous() const noexcept
Return the previous date, or invalid before the supported range.
- Returns:
The previous calendar day.
-
Date next(DayOfWeek dayOfWeek) const noexcept
Return the next requested day of week, or an invalid date if this date is invalid.
-
Date previous(DayOfWeek dayOfWeek) const noexcept
Return the previous requested day of week, or an invalid date if this date is invalid.
-
text::String toString() const
Convert this date to its canonical human-readable representation.
Invalid dates return an empty string.
- Returns:
The date formatted as
YYYY-MM-DD.
-
inline Days toDaysSinceEpoch() const noexcept
Convert to days since epoch, or
-1for invalid dates.
-
Days daysTo(Date other) const noexcept
Calculate the number of days to another date.
Returns zero if either date is invalid.
-
auto toIsoString(IsoTimeFormatFlags flags = cDefaultDateFormat, DateTimePrecision precision = DateTimePrecision::Day) const -> text::String
Convert this date to an ISO 8601 string.
Invalid dates return an empty string.
- Parameters:
flags – Formatting flags for the output.
precision – The largest precision to include.
- Returns:
The ISO-formatted date string.
Public Static Functions
-
static Date fromYearMonthDay(int year, int month, int day) noexcept
Create a date from raw integer parts.
- Parameters:
year – The year (0-9999).
month – The month (1-12).
day – The day (1-31).
- Returns:
A valid date if the parts form a real calendar date, otherwise invalid.
-
static Date fromYearMonthDayOrThrow(int year, int month, int day)
Create a date from raw integer parts or throw.
- Parameters:
year – The year (0-9999).
month – The month (1-12).
day – The day (1-31). Must form a valid calendar date with
yearandmonth.
- Throws:
err::OutOfRangeError – If the parts do not form a supported calendar date.
- Returns:
A valid date.
-
static Date fromParts(Year year, Month month = Month{}, Day day = Day{}) noexcept
Create a date from typed parts.
- Parameters:
year – The year.
month – The month, defaults to January.
day – The day, defaults to the first.
- Returns:
A valid date if the parts form a real calendar date, otherwise invalid.
-
static Date fromPartsOrThrow(Year year, Month month = Month{}, Day day = Day{})
Create a date from typed parts or throw.
- Parameters:
year – The year.
month – The month, defaults to January.
day – The day, defaulting to the first. Must form a valid calendar date with
yearandmonth.
- Throws:
err::OutOfRangeError – If the parts do not form a supported calendar date.
- Returns:
A valid date.
-
static Date fromDaysSinceEpoch(Days days) noexcept
Create a date from days since epoch.
- Parameters:
days – The number of days since epoch.
- Returns:
A valid date if within range, otherwise invalid.
-
static bool exists(Year year, Month month, Day day) noexcept
Test if date parts form an existing date.
- Parameters:
year – The year.
month – The month.
day – The day.
- Returns:
trueif the parts form a valid calendar date.
-
static Date firstDay(Year year) noexcept
Return first day in a year.
- Parameters:
year – The year.
- Returns:
January 1st of the given year.
-
static Date firstDay(Year year, Month month) noexcept
Return first day in a month.
- Parameters:
year – The year.
month – The month.
- Returns:
The first day of the given month.
-
static Date lastDay(Year year) noexcept
Return last day in a year.
- Parameters:
year – The year.
- Returns:
December 31st of the given year.
-
Date() noexcept = default
-
class DateTime
A point in time represented as UTC date/time plus display offset information.
See: Date and Time
Public Functions
-
DateTime() noexcept = default
Create an invalid date/time.
-
inline DateTime(const Date utcDate, const Time utcTime) noexcept
Create a UTC date/time.
If
utcDateis invalid, the resulting date/time is invalid and its time and offset are reset.- Parameters:
utcDate – The date.
utcTime – The time in the UTC timezone.
-
DateTime(Date localDate, Time localTime, Seconds offset) noexcept
Create a fixed-offset local date/time.
Invalid local dates result in an invalid date/time. Offsets are normalized into the supported UTC offset range.
- Parameters:
localDate – The local date.
localTime – The local time.
offset – The UTC offset.
-
inline DateTime(const Date localDate, const Time localTime, const Duration offset) noexcept
Create a fixed-offset local date/time.
- Parameters:
localDate – The local date.
localTime – The local time.
offset – The UTC offset.
-
DateTime(Date localDate, TimeWithZone localTime, TimeOccurrenceInFold occurrence = TimeOccurrenceInFold::First) noexcept
Create a local date/time from a time with a time zone.
Invalid local dates result in an invalid date/time.
- Parameters:
localDate – The local date.
localTime – The local time and its time zone.
occurrence – Which occurrence to use during fold periods.
-
DateTime(Date localDate, Time localTime, TimeZone timeZone, TimeOccurrenceInFold occurrence = TimeOccurrenceInFold::First) noexcept
Create a named-zone local date/time.
Invalid local dates result in an invalid date/time. During folds,
occurrenceselects the first or second possible instant; local times in gaps are resolved using the zone database transition rule.- Parameters:
localDate – The local date.
localTime – The local time.
timeZone – The time zone.
occurrence – Which occurrence to use during fold periods.
-
std::strong_ordering operator<=>(const DateTime &other) const noexcept
Compare two date/time values by their instant and display properties.
-
inline DateTime operator+(const Duration duration) const noexcept
Return this date/time with a duration added.
-
inline DateTime operator-(const Duration duration) const noexcept
Return this date/time with a duration subtracted.
-
inline DateTime &operator-=(const Duration duration) noexcept
Subtract a duration from this date/time.
-
inline Duration operator-(const DateTime &other) const noexcept
Return the signed duration from
otherto this date/time.- Parameters:
other – The other date/time.
- Returns:
The duration from
otherto this.
-
inline DateTime operator+(const CalendarDelta &delta) const noexcept
Return this date/time with a calendar delta added.
-
inline DateTime &operator+=(const CalendarDelta &delta) noexcept
Add a calendar delta to this date/time.
-
inline DateTime operator-(const CalendarDelta &delta) const noexcept
Return this date/time with a calendar delta subtracted.
-
inline DateTime &operator-=(const CalendarDelta &delta) noexcept
Subtract a calendar delta from this date/time.
-
inline constexpr bool isValid() const noexcept
Test if this date/time represents a valid instant.
-
inline constexpr bool isUtc() const noexcept
Test if this date/time is displayed in UTC.
-
inline constexpr bool isLocalTime() const noexcept
Test if the display zone originated from the system-local setting.
-
inline constexpr Date utcDate() const noexcept
Return the stored UTC date, or an invalid date for invalid date/times.
-
inline constexpr Time utcTime() const noexcept
Return the stored UTC time, or midnight for invalid date/times.
-
inline Date date() const noexcept
Return the local display date, or an invalid date for invalid date/times.
-
inline Time time() const noexcept
Return the local display time, or midnight for invalid date/times.
-
inline DayOfYear dayOfYear() const noexcept
Return the local day of year, or one for invalid date/times.
-
inline DayOfWeek dayOfWeek() const noexcept
Return the local day of week, or the epoch weekday for invalid date/times.
-
inline Milliseconds millisecondFraction() const noexcept
Return the local millisecond fraction.
-
inline Nanoseconds nanosecondFraction() const noexcept
Return the local nanosecond fraction.
-
DateTimeParts parts() const noexcept
Return all local date/time parts.
For invalid date/times, returns the same fallback parts as the individual accessors.
-
TimeZone timeZone() const noexcept
Return the display time zone, or UTC for invalid date/times and fixed offsets.
-
text::String timeZoneAbbreviation() const
Return the display time-zone abbreviation, or an empty string when none is available.
-
bool wouldAddSaturate(const CalendarDelta &delta) const noexcept
Test if applying a calendar delta would saturate the supported range.
-
bool wouldSubtractSaturate(const CalendarDelta &delta) const noexcept
Test if subtracting a calendar delta would saturate the supported range.
-
DateTime added(const CalendarDelta &delta) const noexcept
Apply a calendar delta in ascending unit order and clamp at supported bounds.
-
DateTime addedOrThrow(const CalendarDelta &delta) const
Apply a calendar delta in ascending unit order.
- Throws:
err::OverflowError – if an intermediate result exceeds supported bounds.
-
inline void add(const CalendarDelta &delta) noexcept
Apply a calendar delta in place and clamp at supported bounds.
-
inline void addOrThrow(const CalendarDelta &delta)
Apply a calendar delta in place.
- Throws:
err::OverflowError – if an intermediate result exceeds supported bounds.
-
inline DateTime subtracted(const CalendarDelta &delta) const noexcept
Subtract a calendar delta in ascending unit order and clamp at supported bounds.
-
inline DateTime subtractedOrThrow(const CalendarDelta &delta) const
Subtract a calendar delta in ascending unit order.
- Throws:
err::OverflowError – if an intermediate result exceeds supported bounds.
-
inline void subtract(const CalendarDelta &delta) noexcept
Subtract a calendar delta in place and clamp at supported bounds.
-
inline void subtractOrThrow(const CalendarDelta &delta)
Subtract a calendar delta in place.
- Throws:
err::OverflowError – if an intermediate result exceeds supported bounds.
-
bool wouldAddSaturate(Duration duration) const noexcept
Test if adding a duration would saturate to the first or last supported date/time.
Returns
falsefor invalid date/times.- Parameters:
duration – The duration to add.
- Returns:
trueif the result would be clamped to the supported date/time range.
-
bool wouldSubtractSaturate(Duration duration) const noexcept
Test if subtracting a duration would saturate to the first or last supported date/time.
Returns
falsefor invalid date/times.- Parameters:
duration – The duration to subtract.
- Returns:
trueif the result would be clamped to the supported date/time range.
-
DateTime added(Duration duration) const noexcept
Return this date/time plus a duration, clamped to the supported date/time range.
Invalid date/times stay invalid.
-
DateTime addedOrThrow(Duration duration) const
Return this date/time plus a duration.
Invalid date/times stay invalid.
- Parameters:
duration – The duration to add.
- Throws:
err::OverflowError – if the result would exceed the supported date/time range.
- Returns:
The resulting date/time.
-
inline void add(const Duration duration) noexcept
Add a duration in place, clamped to the supported date/time range.
Invalid date/times stay invalid.
-
inline void addOrThrow(const Duration duration)
Add a duration in place.
Invalid date/times stay invalid.
- Parameters:
duration – The duration to add.
- Throws:
err::OverflowError – if the result would exceed the supported date/time range.
-
inline DateTime subtracted(const Duration duration) const noexcept
Return this date/time minus a duration, clamped to the supported date/time range.
Invalid date/times stay invalid.
-
DateTime subtractedOrThrow(Duration duration) const
Return this date/time minus a duration.
Invalid date/times stay invalid.
- Parameters:
duration – The duration to subtract.
- Throws:
err::OverflowError – if the result would exceed the supported date/time range.
- Returns:
The resulting date/time.
-
inline void subtract(const Duration duration) noexcept
Subtract a duration in place, clamped to the supported date/time range.
Invalid date/times stay invalid.
-
inline void subtractOrThrow(const Duration duration)
Subtract a duration in place.
Invalid date/times stay invalid.
- Parameters:
duration – The duration to subtract.
- Throws:
err::OverflowError – if the result would exceed the supported date/time range.
-
Duration durationTo(const DateTime &other) const noexcept
Calculate the signed duration from this date/time to
other.Invalid date/times participate as
-1seconds since epoch.- Parameters:
other – The other date/time.
- Returns:
The duration from this to
other.
-
TimeDelta timeDeltaTo(const DateTime &other) const noexcept
Calculate the signed nanosecond time delta from this date/time to
other.Invalid date/times participate as
-1seconds since epoch.
-
text::String toString() const
Convert this date/time to a compact human-readable representation.
Invalid date/times return an empty string.
- Returns:
The displayed date/time followed by its resolved offset.
-
DateTime toUtc() const noexcept
Convert to UTC, or return an invalid date/time if this date/time is invalid.
-
DateTime toTimeZone(TimeZone timeZone) const noexcept
Convert the display time zone, or return an invalid date/time if this date/time is invalid.
-
std::time_t toTimeT() const noexcept
Convert to
std::time_tusing the POSIX epoch.Fractions of seconds are discarded. Invalid date/times convert from the internal
-1seconds sentinel.
-
auto toSecondsAndFractions(TimeEpoch epoch = TimeEpoch::Core) const noexcept -> std::optional<std::pair<Seconds, Nanoseconds>>
Convert to complete seconds and a nanosecond fraction from an epoch.
This is the only method that returns the full precision of a date/time value.
- Parameters:
epoch – The epoch.
- Returns:
The non-negative seconds and fraction, or no value if this date/time precedes the epoch or is invalid.
-
auto toSecondsAndFractionsOrThrow(TimeEpoch epoch = TimeEpoch::Core) const -> std::pair<Seconds, Nanoseconds>
Convert to complete seconds and a nanosecond fraction from an epoch.
This is the only method that returns the full precision of a date/time value. This date/time must be valid and must not precede
epoch.- Parameters:
epoch – The epoch.
- Throws:
err::OutOfRangeError – If the date/time or epoch ticks cannot be represented in the requested range.
- Returns:
The non-negative seconds and fraction.
-
template<typename tUnit>
std::optional<tUnit> toTicks(TimeEpoch epoch = TimeEpoch::Core) const noexcept Convert to exact ticks in seconds, milliseconds, microseconds or nanoseconds from an epoch.
Fractions outside the precision of the tick unit are discarded.
- Template Parameters:
tUnit – The tick unit: Nanoseconds, Microseconds, Milliseconds, or Seconds.
- Parameters:
epoch – The epoch.
- Returns:
Exact non-negative ticks, or no value if they cannot represent this date/time.
-
inline std::optional<Seconds> toSeconds(const TimeEpoch epoch = TimeEpoch::Core) const noexcept
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
-
inline auto toNanoseconds(const TimeEpoch epoch = TimeEpoch::Core) const noexcept -> std::optional<Nanoseconds>
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
-
template<typename tUnit>
tUnit toTicksOrThrow(TimeEpoch epoch = TimeEpoch::Core) const Convert to exact ticks in seconds, milliseconds, microseconds or nanoseconds from an epoch.
Fractions outside the precision of the tick unit are discarded. This date/time must be representable as ticks of
tUnitrelative toepoch.- Template Parameters:
tUnit – The tick unit: Nanoseconds, Microseconds, Milliseconds, or Seconds.
- Parameters:
epoch – The epoch.
- Throws:
err::OutOfRangeError – If the date/time or epoch ticks cannot be represented in the requested range.
- Returns:
Exact non-negative ticks.
-
inline Seconds toSecondsOrThrow(const TimeEpoch epoch = TimeEpoch::Core) const
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
- Throws:
err::OutOfRangeError – If the date/time or epoch ticks cannot be represented in the requested range.
-
inline Nanoseconds toNanosecondsOrThrow(const TimeEpoch epoch = TimeEpoch::Core) const
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
- Throws:
err::OutOfRangeError – If the date/time or epoch ticks cannot be represented in the requested range.
-
auto toIsoString(IsoTimeFormatFlags flags = cDefaultDateTimeFormat, DateTimePrecision precision = DateTimePrecision::Second) const -> text::String
Convert this date/time to an ISO 8601 string.
Invalid date/times return an empty string.
- Parameters:
flags – Formatting flags for date, time, and offset output.
precision – The largest precision to include in the text.
- Returns:
The ISO-formatted string.
Public Static Functions
-
static DateTime now() noexcept
Return the current UTC date/time with nanosecond precision when supported by the platform clock.
-
static DateTime fromTimeT(std::time_t posixTime) noexcept
Create a UTC date/time from a POSIX time value.
Returns an invalid date/time if the value is outside the supported date/time range.
-
template<typename tUnit>
static auto fromTicks(tUnit ticks, TimeEpoch epoch = TimeEpoch::Core) noexcept -> std::optional<DateTime> Create a UTC date/time from exact ticks in seconds, milliseconds, microseconds or nanoseconds since an epoch.
Fractions outside the precision of the tick unit are discarded.
- Template Parameters:
tUnit – The tick unit: Nanoseconds, Microseconds, Milliseconds, or Seconds.
- Parameters:
ticks – The non-negative ticks.
epoch – The epoch.
- Returns:
A date/time, or no value if the ticks cannot be represented.
-
static inline auto fromSeconds(const Seconds ticks, const TimeEpoch epoch = TimeEpoch::Core) noexcept -> std::optional<DateTime>
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
-
static inline auto fromNanoseconds(const Nanoseconds ticks, const TimeEpoch epoch = TimeEpoch::Core) noexcept -> std::optional<DateTime>
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
-
template<typename tUnit>
static DateTime fromTicksOrThrow(tUnit ticks, TimeEpoch epoch = TimeEpoch::Core) Create a UTC date/time from exact ticks in seconds, milliseconds, microseconds or nanoseconds since an epoch.
Fractions outside the precision of the tick unit are discarded.
- Template Parameters:
tUnit – The tick unit: Nanoseconds, Microseconds, Milliseconds, or Seconds.
- Parameters:
ticks – The non-negative tick count. Must produce a representable date/time relative to
epoch.epoch – The epoch.
- Throws:
err::OutOfRangeError – If the date/time or epoch ticks cannot be represented in the requested range.
- Returns:
A date/time.
-
static inline auto fromSecondsOrThrow(const Seconds ticks, const TimeEpoch epoch = TimeEpoch::Core) -> DateTime
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
- Throws:
err::OutOfRangeError – If the date/time or epoch ticks cannot be represented in the requested range.
-
static inline auto fromNanosecondsOrThrow(const Nanoseconds ticks, const TimeEpoch epoch = TimeEpoch::Core) -> DateTime
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
- Throws:
err::OutOfRangeError – If the date/time or epoch ticks cannot be represented in the requested range.
-
static auto fromTicks(Seconds seconds, Nanoseconds fractions, TimeEpoch epoch = TimeEpoch::Core) noexcept -> std::optional<DateTime>
Create a UTC date/time from complete seconds and a nanosecond fraction since an epoch.
This is the only method that allows to construct a date/time at it’s full range and precision.
- Parameters:
seconds – The non-negative complete seconds.
fractions – The nanosecond fraction in the range 0 to 999999999.
epoch – The epoch.
- Returns:
A date/time, or no value if the values cannot be represented.
-
static auto fromTicksOrThrow(Seconds seconds, Nanoseconds fractions, TimeEpoch epoch = TimeEpoch::Core) -> DateTime
Create a UTC date/time from complete seconds and a nanosecond fraction since an epoch.
This is the only method that allows to construct a date/time at it’s full range and precision.
- Parameters:
seconds – The non-negative complete seconds. Together with
fractionsandepoch, must produce a representable date/time.fractions – The nanosecond fraction in the range 0 to 999999999.
epoch – The epoch.
- Throws:
err::OutOfRangeError – If the date/time or epoch ticks cannot be represented in the requested range.
- Returns:
A date/time.
-
static auto fromIsoString(const text::String &text, DateTimePrecision requiredPrecision = DateTimePrecision::Second) noexcept -> DateTime
Parse an ISO date/time string.
- Parameters:
text – The text to parse.
requiredPrecision – The minimum precision required.
- Returns:
The date-time or an invalid date/time if parsing fails.
-
static auto fromIsoStringOrThrow(const text::String &text, DateTimePrecision requiredPrecision = DateTimePrecision::Second) -> DateTime
Parse an ISO date/time string or throw on errors.
- Parameters:
text – The text to parse.
requiredPrecision – The minimum precision required.
- Throws:
err::ParseError – If parsing fails.
- Returns:
A valid date/time.
-
static auto fromIsoString(const text::String &text, TimeZone timeZone, DateTimePrecision requiredPrecision = DateTimePrecision::Second) noexcept -> DateTime
Parse an ISO local date/time string in the given time zone.
- Parameters:
text – The text to parse.
timeZone – The time zone to interpret the local time.
requiredPrecision – The minimum precision required.
- Returns:
The date-time or an invalid date/time if parsing fails.
-
static auto fromIsoStringOrThrow(const text::String &text, TimeZone timeZone, DateTimePrecision requiredPrecision = DateTimePrecision::Second) -> DateTime
Parse an ISO local date/time string in the given time zone or throw on errors.
- Parameters:
text – The text to parse.
timeZone – The time zone to interpret the local time.
requiredPrecision – The minimum precision required.
- Throws:
err::ParseError – If parsing fails.
- Returns:
A valid date/time.
-
DateTime() noexcept = default
-
struct DateTimeParts
A local date/time split into named parts.
Public Members
-
Nanoseconds nanosecondFraction
The local nanosecond fraction.
-
Nanoseconds nanosecondFraction
-
enum class erbsland::time::DateTimePrecision : uint8_t
Precision levels for ISO date/time parsing and formatting.
Controls how much detail is required when parsing or how much is emitted when formatting.
Values:
-
enumerator Day
Full date (e.g.
2025-06-15).
-
enumerator Hour
Full date and hour (e.g.
2025-06-15T14).
-
enumerator Minute
Full date and minute (e.g.
2025-06-15T14:30).
-
enumerator Second
Full date and second (e.g.
2025-06-15T14:30:45).
-
enumerator Millisecond
Full date and time with a millisecond fraction (e.g.
2025-06-15T14:30:45.123).
-
enumerator Microsecond
Full date and time with a microsecond fraction (e.g.
2025-06-15T14:30:45.123456).
-
enumerator Nanosecond
Full date and time with a nanosecond fraction (e.g.
2025-06-15T14:30:45.123456789).
-
enumerator Day
-
class Day : public erbsland::time::impl::TimePartWithAmount<Day, Days, int8_t, 1, 31>
A day within a month, range
1..31.Provides clamped arithmetic and month-aware navigation methods like
next()andprevious().Public Functions
-
bool exists(Year year, Month month) const noexcept
Test if this day exists in the given month.
- Parameters:
year – The year to check.
month – The month to check.
- Returns:
trueif this day is valid in the given month and year.
-
bool isLast(Year year, Month month) const noexcept
Test if this is the last day in the given month.
- Parameters:
year – The year to check.
month – The month to check.
- Returns:
trueif this day equals the last day of the month.
-
bool hasNext(Year year, Month month) const noexcept
Test if this day has a following date in the supported date range.
- Parameters:
year – The year to check.
month – The month to check.
- Returns:
trueif advancing this day does not exceed the supported range.
-
bool hasPrevious(Year year, Month month) const noexcept
Test if this day has a previous date in the supported date range.
- Parameters:
year – The year to check.
month – The month to check.
- Returns:
trueif retreating this day does not go below the supported range.
-
Day clamped(Year year, Month month) const noexcept
Return the day, clamped to the valid range of the given year and month.
- Parameters:
year – The year.
month – The month.
- Returns:
The clamped day.
-
DateParts next(Year year, Month month) const noexcept
Return the next calendar day parts, clamped at the valid date range.
If this is the last supported date, the result stays at the same date.
- Parameters:
year – The current year.
month – The current month.
- Returns:
The next calendar date parts.
-
DateParts previous(Year year, Month month) const noexcept
Return the previous calendar day parts, clamped at the valid date range.
If this is the first supported date, the result stays at the same date.
- Parameters:
year – The current year.
month – The current month.
- Returns:
The previous calendar date parts.
Public Static Functions
-
static Day last(Year year, Month month) noexcept
Return the last day for the given month.
- Parameters:
year – The year to check.
month – The month to check.
- Returns:
The last valid day of the month (28-31).
-
bool exists(Year year, Month month) const noexcept
-
class DayOfWeek : public erbsland::time::impl::TimePartWithAmount<DayOfWeek, Days, int8_t, 0, 6>
A day of week, Monday (
0) through Sunday (6).Provides clamped arithmetic.
Public Functions
-
Days daysToNext(DayOfWeek dayOfWeek) const noexcept
Days to the next occurrence, excluding today unless equal.
- Parameters:
dayOfWeek – The target day of week.
- Returns:
The signed number of days to the next occurrence.
-
Days daysToPrevious(DayOfWeek dayOfWeek) const noexcept
Days to the previous occurrence, excluding today unless equal.
- Parameters:
dayOfWeek – The target day of week.
- Returns:
The signed number of days to the previous occurrence.
-
text::String toString(DayOfWeekFormat format = DayOfWeekFormat::Long) const
Convert this day to a display string.
- Parameters:
format – The formatting style (short or long name).
- Returns:
A read-only string of the day name.
Public Static Functions
-
Days daysToNext(DayOfWeek dayOfWeek) const noexcept
-
enum class erbsland::time::DayOfWeekFormat : uint8_t
Formatting style for day-of-week names.
Used by
DayOfWeek::toString()to control the output format.Values:
-
enumerator Short
-
enumerator Long
-
enumerator Short
-
class DayOfYear : public erbsland::time::impl::TimePartWithAmount<DayOfYear, Days, int16_t, 1, 366>
A one-based day of year, range
1..365(or1..366in leap years).Provides clamped arithmetic.
Public Functions
Public Static Functions
-
static DayOfYear last(Year year) noexcept
Return the last day of year for
year.- Parameters:
year – The year to query.
- Returns:
365 for common years, 366 for leap years.
-
static DayOfYear last(Year year) noexcept
-
class Duration
A signed duration with a resolution of seconds.
Represents a span of time measured in seconds, with helper methods to split into days, hours, minutes, and seconds components. Arithmetic uses the saturating behavior of the underlying second amount.
Public Functions
-
Duration() noexcept = default
Create a zero duration.
-
inline explicit Duration(const Seconds seconds) noexcept
Create a duration from seconds.
- Parameters:
seconds – The second value.
-
template<typename tAmount>
inline explicit Duration(tAmount amount) noexcept Create a duration from any seconds-based amount.
- Template Parameters:
tAmount – The amount type with a
SecondsUnitTag.- Parameters:
amount – The amount to convert.
-
template<typename tRep, typename tPeriod>
inline explicit Duration(std::chrono::duration<tRep, tPeriod> duration) noexcept Create a duration from a
std::chrono::duration, truncating to seconds.- Template Parameters:
tRep – The representation type.
tPeriod – The period type.
- Parameters:
duration – The chrono duration to convert.
-
explicit Duration(Parts parts) noexcept
Create a duration from split parts.
- Parameters:
parts – The parts to combine.
-
Duration operator+(Duration other) const noexcept
Return the sum of this duration and another duration.
-
Duration operator-(Duration other) const noexcept
Return the difference between this duration and another duration.
-
inline constexpr bool isZero() const noexcept
Test if this duration is zero.
-
inline constexpr bool isPositive() const noexcept
Test if the duration is positive.
-
inline constexpr bool isNegative() const noexcept
Test if the duration is negative.
-
Seconds seconds() const noexcept
Return the seconds component (0-59).
- Returns:
The seconds component within the minute.
-
Minutes minutes() const noexcept
Return the minutes component (0-59).
- Returns:
The minutes component within the hour.
-
Hours hours() const noexcept
Return the hours component (0-23).
- Returns:
The hours component within the day.
-
Parts parts(DurationPart largestPart = DurationPart::Days) const noexcept
Split this duration into day/hour/minute/second parts.
The
largestPartparameter controls which unit is used as the top-level component. For example,DurationPart::Weeksincludes weeks in the result. Negative durations keep negative signs in their extracted components.- Parameters:
largestPart – The largest unit to include.
- Returns:
Named weeks, days, hours, minutes, and seconds parts.
-
inline constexpr Seconds toSeconds() const noexcept
Return the total seconds.
- Returns:
The total second value.
-
std::chrono::seconds toStdSeconds() const noexcept
Convert to
std::chrono::seconds.- Returns:
The equivalent chrono duration.
-
DaysAndNanoseconds toDaysAndNanoseconds() const noexcept
Split into whole days and a signed sub-day nanosecond remainder.
- Returns:
Whole days and remaining nanoseconds.
-
double toDaysWithFractions() const noexcept
Convert to days with fractions.
- Returns:
The total signed duration in days.
-
bool wouldConvertToTimeDeltaSaturate() const noexcept
Test if conversion to
TimeDeltawould saturate.- Returns:
trueiftoTimeDelta()would return a saturated nanosecond value.
-
TimeDelta toTimeDelta() const noexcept
Convert to a time delta with nanosecond precision, saturating if outside nanosecond bounds.
- Returns:
The saturated time delta.
-
TimeDelta toTimeDeltaOrThrow() const
Convert to a time delta with nanosecond precision.
- Throws:
err::OverflowError – if the conversion would saturate.
- Returns:
The time delta.
Public Static Functions
-
struct DaysAndNanoseconds
Split duration into whole days and a signed sub-day nanosecond remainder.
Public Members
-
Nanoseconds nanoseconds
Signed sub-day nanosecond remainder.
-
Nanoseconds nanoseconds
-
struct Parts
Split duration parts.
-
Duration() noexcept = default
-
enum class erbsland::time::DurationPart : uint8_t
Controls which part is used as the largest unit when splitting a duration into parts.
For example,
DurationPart::DayscausesDuration::parts()to return days as the largest unit, with weeks zeroed out.Values:
-
enumerator Seconds
The seconds part.
-
enumerator Minutes
The minutes part.
-
enumerator Hours
The hours part.
-
enumerator Days
The days part.
-
enumerator Weeks
The weeks part.
-
enumerator Seconds
-
class ElapsedTimer
A small helper for measuring elapsed monotonic time.
Starts timing on construction and provides elapsed time queries.
-
class Hour : public erbsland::time::impl::TimePartWithAmount<Hour, Hours, int8_t, 0, 23>
An hour within a day, range
0..23.Provides clamped arithmetic.
-
enum class erbsland::time::IsoTimeFormat : uint8_t
Flags for ISO date/time formatting.
Values:
-
enumerator Extended
Use separators such as
-,:, and extended offsets.
-
enumerator TimePrefix
Prefix standalone time output with
T.
-
enumerator TimeShift
Append the UTC offset for date/time output.
-
enumerator TimeShiftAlwaysComplete
Format zero offset numerically instead of
Z.
-
enumerator TimeShiftUpToSeconds
Include offset seconds when needed.
-
enumerator UseDotFraction
Use
.instead of,before fractional seconds.
-
enumerator All
-
enumerator Extended
-
using erbsland::time::IsoTimeFormatFlags = util::EnumFlags<IsoTimeFormat>
A set of ISO date/time formatting flags.
-
inline Nanoseconds erbsland::time::literals::operator""_ns(const unsigned long long value)
Literal for nanoseconds.
-
inline Microseconds erbsland::time::literals::operator""_us(const unsigned long long value)
Literal for microseconds.
-
inline Milliseconds erbsland::time::literals::operator""_ms(const unsigned long long value)
Literal for milliseconds.
-
inline Seconds erbsland::time::literals::operator""_s(const unsigned long long value)
Literal for seconds.
-
inline Minutes erbsland::time::literals::operator""_m(const unsigned long long value)
Literal for minutes.
-
inline Hours erbsland::time::literals::operator""_h(const unsigned long long value)
Literal for hours.
-
class Minute : public erbsland::time::impl::TimePartWithAmount<Minute, Minutes, int8_t, 0, 59>
A minute within an hour, range
0..59.Provides clamped arithmetic.
-
class Month : public erbsland::time::impl::TimePartWithAmount<Month, Months, int8_t, 1, 12>
A month in the Gregorian calendar, range
1..12.Provides clamped arithmetic, month-aware navigation and calendar computation methods.
Public Functions
-
Days dayCount(Year year) const noexcept
Return the number of days in this month of
year.- Parameters:
year – The year to check.
- Returns:
The day count (28-31).
-
Day lastDay(Year year) const noexcept
Return the last day in this month of
year.- Parameters:
year – The year to check.
- Returns:
The last valid day.
-
DayOfYear firstDayOfYear(Year year) const noexcept
Return the first day-of-year for this month of
year.- Parameters:
year – The year to check.
- Returns:
The one-based day-of-year of the first day.
-
DayOfYear lastDayOfYear(Year year) const noexcept
Return the last day-of-year for this month of
year.- Parameters:
year – The year to check.
- Returns:
The one-based day-of-year of the last day.
-
Days minimumDayCount() const noexcept
Return the minimum number of days this month can have.
- Returns:
28 for February, 30 for April/June/September/November, 31 otherwise.
-
Days maximumDayCount() const noexcept
Return the maximum number of days this month can have.
- Returns:
Same as
minimumDayCount(), except February returns 29 in leap years.
-
inline bool hasFixedLength() const noexcept
Test if the month has a fixed length in every year.
- Returns:
truefor all months except February.
-
YearMonthParts next(Year year) const noexcept
Return the next month parts, clamped at the supported date range.
If this is December of the last supported year, the result stays at the same year and month.
- Parameters:
year – The current year.
- Returns:
The next year and month.
-
YearMonthParts previous(Year year) const noexcept
Return the previous month parts, clamped at the supported date range.
If this is January of the first supported year, the result stays at the same year and month.
- Parameters:
year – The current year.
- Returns:
The previous year and month.
Public Static Functions
-
static MonthDayParts extractMonthAndDay(Year year, Days days) noexcept
Extract the month and day from a zero-based day-of-year amount.
Values outside the year are clamped by
DayOfYear::fromAmount()before extraction.- Parameters:
year – The year to use for leap year calculation.
days – The zero-based day-of-year amount.
- Returns:
The extracted month and day.
-
static MonthDayParts extractMonthAndDay(Year year, DayOfYear dayOfYear) noexcept
Extract the month and day from a one-based day-of-year.
Out-of-range day-of-year values are already clamped by
DayOfYear.- Parameters:
year – The year to use for leap year calculation.
dayOfYear – The one-based day-of-year.
- Returns:
The extracted month and day.
-
Days dayCount(Year year) const noexcept
-
class Second : public erbsland::time::impl::TimePartWithAmount<Second, Seconds, int8_t, 0, 59>
A second within a minute, range
0..59.Provides clamped arithmetic.
-
class Time
A wall-clock time of day with nanosecond precision.
Represents a time within a day from midnight to just before the next midnight. Stored internally as nanoseconds since midnight for sub-second precision.
See: Date and Time
Public Functions
-
Time() noexcept = default
Create midnight (zero time).
-
Time(Hour hour, Minute minute, Second second = Second{}, Nanoseconds nsFraction = Nanoseconds{}) noexcept
Create a time from parts.
The hour, minute and second part types clamp their construction input to their valid ranges. The nanosecond fraction is additionally clamped to the range
0..999999999.- Parameters:
hour – The hour (0-23).
minute – The minute (0-59).
second – The second (0-59), defaults to zero.
nsFraction – The nanosecond fraction (0-999999999), defaults to zero.
-
inline constexpr bool isZero() const noexcept
Test if this time is exactly midnight.
-
Milliseconds millisecondFraction() const noexcept
Return the millisecond fraction of the second.
- Returns:
The millisecond component (0-999).
-
Nanoseconds nanosecondFraction() const noexcept
Return the nanosecond fraction of the second.
- Returns:
The nanosecond component (0-999999999).
-
TimeParts parts() const noexcept
Return all time parts.
- Returns:
Named hour, minute, second, and nanosecond fraction parts.
-
Duration durationSinceMidnight() const noexcept
Return the duration since midnight.
- Returns:
The duration from midnight, truncated to seconds.
-
TimeDelta timeDeltaSinceMidnight() const noexcept
Return the time delta since midnight with nanosecond precision.
- Returns:
The time delta from midnight.
-
text::String toString() const
Convert this time to a compact human-readable string.
The result always contains hours, minutes and seconds. A non-zero nanosecond fraction is appended without trailing zeroes.
- Returns:
The formatted time.
-
Seconds toSecondsSinceMidnight() const noexcept
Return the total seconds since midnight.
- Returns:
The seconds since midnight.
-
Nanoseconds toNanosecondsSinceMidnight() const noexcept
Return the total nanoseconds since midnight.
- Returns:
The nanoseconds since midnight.
-
auto toIsoString(IsoTimeFormatFlags flags = cDefaultTimeFormat, DateTimePrecision precision = DateTimePrecision::Second) const -> text::String
Convert this time to an ISO 8601 string.
- Parameters:
flags – Formatting flags for the output.
precision – The largest precision to include.
- Returns:
The ISO-formatted time string.
-
Days addWithWrap(TimeDelta delta) noexcept
Add a time delta, wrapping past midnight.
Any positive or negative delta is accepted. If the addition crosses midnight, the time wraps and the number of days crossed is returned. Negative deltas return a negative day count.
- Parameters:
delta – The delta to add.
- Returns:
The number of days crossed (positive or negative).
-
Days addWithWrap(Duration duration) noexcept
Add a duration, wrapping past midnight.
Any positive or negative duration is accepted. Negative durations return a negative day count.
- Parameters:
duration – The duration to add.
- Returns:
The number of days crossed (positive or negative).
-
TimeWrapResult addedWithWrap(TimeDelta delta) const noexcept
Return this time plus a delta, wrapping past midnight.
- Parameters:
delta – The delta to add.
- Returns:
The wrapped time and the number of days crossed.
-
TimeWrapResult addedWithWrap(Duration duration) const noexcept
Return this time plus a duration, wrapping past midnight.
- Parameters:
duration – The duration to add.
- Returns:
The wrapped time and the number of days crossed.
Public Static Functions
-
static Time fromDurationSinceMidnight(TimeDelta duration) noexcept
Create a time from a duration since midnight.
Negative and over-day values wrap into the 24-hour range.
- Parameters:
duration – The duration since midnight.
- Returns:
The resulting time, wrapped if necessary.
-
Time() noexcept = default
-
using erbsland::time::Nanoseconds = unit::IntegerAmount<SecondsUnitTag, std::nano>
Nanosecond amount.
-
using erbsland::time::Microseconds = unit::IntegerAmount<SecondsUnitTag, std::micro>
Microsecond amount.
-
using erbsland::time::Milliseconds = unit::IntegerAmount<SecondsUnitTag, std::milli>
Millisecond amount.
-
using erbsland::time::Seconds = unit::IntegerAmount<SecondsUnitTag, std::ratio<1>>
Second amount.
-
using erbsland::time::Minutes = unit::IntegerAmount<SecondsUnitTag, std::ratio<60>>
Minute amount.
-
using erbsland::time::Hours = unit::IntegerAmount<SecondsUnitTag, std::ratio<3600>>
Hour amount.
-
using erbsland::time::Days = unit::IntegerAmount<SecondsUnitTag, std::ratio<86400>>
Day amount.
-
using erbsland::time::Weeks = unit::IntegerAmount<SecondsUnitTag, std::ratio<604800>>
Week amount.
-
using erbsland::time::Months = unit::IntegerAmount<MonthsUnitTag, std::ratio<1>>
Month amount.
-
using erbsland::time::Years = unit::IntegerAmount<YearsUnitTag, std::ratio<1>>
Year amount.
-
class TimeDelta
A signed time delta with nanosecond resolution.
Represents a duration between two points in time with full nanosecond precision. Arithmetic uses the saturating behavior of the underlying nanosecond amount.
Public Types
-
using IntegerValue = Nanoseconds::Value
The native integer type this delta is based on.
Public Functions
-
TimeDelta() noexcept = default
Create a zero delta.
-
inline explicit TimeDelta(const Nanoseconds nanoseconds) noexcept
Create a delta from nanoseconds.
- Parameters:
nanoseconds – The nanosecond value.
-
template<typename tAmount>
inline constexpr TimeDelta(tAmount amount) noexcept Create a delta from any seconds-based amount.
Saturates if the value exceeds the maximum representable value.
- Template Parameters:
tAmount – The amount type with a
SecondsUnitTag.- Parameters:
amount – The amount to convert.
-
template<typename tRep, typename tPeriod>
inline explicit TimeDelta(std::chrono::duration<tRep, tPeriod> duration) noexcept Create a delta from a
std::chrono::duration.- Template Parameters:
tRep – The representation type.
tPeriod – The period type.
- Parameters:
duration – The chrono duration to convert.
-
TimeDelta operator/(IntegerValue divisor) const noexcept
Divide this time delta.
By dividing the time-delta with regular integer, the result is a time-delta.
-
TimeDelta &operator/=(IntegerValue divisor) noexcept
Divide this time delta.
-
IntegerValue operator/(TimeDelta divisor) const noexcept
By dividing the time-delta with another time-delta, the result is a regular integer.
-
TimeDelta operator*(IntegerValue factor) const noexcept
Multiply this time delta.
-
TimeDelta &operator*=(IntegerValue factor) noexcept
Multiply this time delta.
-
inline constexpr bool isZero() const noexcept
Test if this delta is zero.
-
inline constexpr bool isPositive() const noexcept
Test if this delta is positive.
-
inline constexpr bool isNegative() const noexcept
Test if this delta is negative.
-
template<typename tAmount>
inline TimeDelta minimum(tAmount amount) const noexcept Return a time delta that is at minimum the given value.
-
text::String toString(const TimeDeltaFormat &format = {}) const
Convert this delta to a human-readable string.
-
inline constexpr Nanoseconds toNanoseconds() const noexcept
Return the total nanoseconds.
-
Milliseconds toMilliseconds() const noexcept
Return the total milliseconds, truncating sub-milliseconds nanoseconds toward zero.
-
Seconds toSeconds() const noexcept
Return the total seconds, truncating sub-second nanoseconds toward zero.
-
double toSecondsWithFractions() const noexcept
Return the total seconds as a floating-point value.
-
double toDaysWithFractions() const noexcept
Return the total days as a floating-point value.
-
std::chrono::nanoseconds toStdNanoseconds() const noexcept
Convert to
std::chrono::nanoseconds.
Public Static Functions
-
static TimeDelta microseconds(int64_t ticks) noexcept
Return a time delta in microseconds.
If the value exceeds the maximum representable value, it saturates to the maximum.
-
static TimeDelta milliseconds(int64_t ticks) noexcept
Return a time delta in milliseconds.
If the value exceeds the maximum representable value, it saturates to the maximum.
-
static TimeDelta seconds(int64_t ticks) noexcept
Return a time delta in seconds.
If the value exceeds the maximum representable value, it saturates to the maximum.
-
static TimeDelta minutes(int64_t ticks) noexcept
Return a time delta in minutes.
If the value exceeds the maximum representable value, it saturates to the maximum.
-
static TimeDelta hours(int64_t ticks) noexcept
Return a time delta in hours.
If the value exceeds the maximum representable value, it saturates to the maximum.
-
static TimeDelta days(int64_t ticks) noexcept
Return a time delta in days.
If the value exceeds the maximum representable value, it saturates to the maximum.
-
static TimeDelta weeks(int64_t ticks) noexcept
Return a time delta in weeks.
If the value exceeds the maximum representable value, it saturates to the maximum.
-
static TimeDelta microsecondsOrThrow(int64_t ticks)
Return a time delta in microseconds.
- Throws:
err::OverflowError – If the value exceeds the maximum representable value.
-
static TimeDelta millisecondsOrThrow(int64_t ticks)
Return a time delta in milliseconds.
- Throws:
err::OverflowError – If the value exceeds the maximum representable value.
-
static TimeDelta secondsOrThrow(int64_t ticks)
Return a time delta in seconds.
- Throws:
err::OverflowError – If the value exceeds the maximum representable value.
-
static TimeDelta minutesOrThrow(int64_t ticks)
Return a time delta in minutes.
- Throws:
err::OverflowError – If the value exceeds the maximum representable value.
-
static TimeDelta hoursOrThrow(int64_t ticks)
Return a time delta in hours.
- Throws:
err::OverflowError – If the value exceeds the maximum representable value.
-
static TimeDelta daysOrThrow(int64_t ticks)
Return a time delta in days.
- Throws:
err::OverflowError – If the value exceeds the maximum representable value.
-
static TimeDelta weeksOrThrow(int64_t ticks)
Return a time delta in weeks.
- Throws:
err::OverflowError – If the value exceeds the maximum representable value.
-
using IntegerValue = Nanoseconds::Value
-
class TimeDeltaFormat
Options for formatting fixed and calendar time deltas.
See: Date and Time
Public Types
Public Functions
-
TimeDeltaFormat()
Create the default compact human-readable format.
-
inline TimeDeltaFormat &setUnitStyle(UnitStyle value) noexcept
Set the style used to render unit names.
-
inline const text::String &valueSeparator() const noexcept
Get the separator placed between a value and its unit name.
-
inline TimeDeltaFormat &setValueSeparator(text::String value) noexcept
Set the separator placed between a value and its unit name.
-
inline const text::String &unitSeparator() const noexcept
Get the separator placed between formatted time-delta components.
-
inline TimeDeltaFormat &setUnitSeparator(text::String value) noexcept
Set the separator placed between formatted time-delta components.
-
inline TimeDeltaUnit smallestUnit() const noexcept
Get the smallest unit included in the formatted result.
-
inline TimeDeltaFormat &setSmallestUnit(TimeDeltaUnit value) noexcept
Set the smallest unit included in the formatted result.
-
inline bool showFractions() const noexcept
Test if fractional values are included in the formatted result.
-
inline TimeDeltaFormat &setShowFractions(bool value) noexcept
Set whether fractional values are included in the formatted result.
-
inline uint8_t maximumFractionDigits() const noexcept
Get the maximum number of fractional digits.
-
TimeDeltaFormat &setMaximumFractionDigits(uint8_t value) noexcept
Set the maximum number of fractional digits, limited to nine.
-
inline bool usesElclUnitNames() const noexcept
Test if ELCL-specific short aliases are selected.
Public Static Functions
-
static TimeDeltaFormat shortUnits()
Create the default short-unit format.
-
static TimeDeltaFormat longUnits()
Create the long-unit format.
-
static TimeDeltaFormat elcl()
Create an ELCL-compatible format.
-
TimeDeltaFormat()
-
enum class erbsland::time::TimeDeltaUnit : uint8_t
A fixed unit available for time-delta formatting.
Values:
-
enumerator Nanoseconds
-
enumerator Microseconds
-
enumerator Milliseconds
-
enumerator Seconds
-
enumerator Minutes
-
enumerator Hours
-
enumerator Days
-
enumerator Weeks
-
enumerator Nanoseconds
-
enum class erbsland::time::TimeEpoch : uint8_t
A well-known time epoch.
Values:
-
enumerator Core
The Erbsland Core epoch, 0000-01-01 00:00:00 UTC.
-
enumerator Posix
The POSIX epoch, 1970-01-01 00:00:00 UTC.
-
enumerator Windows
The Windows FILETIME epoch, 1601-01-01 00:00:00 UTC.
-
enumerator Rfc868
The RFC 868 epoch, 1900-01-01 00:00:00 UTC.
-
enumerator Core
-
enum class erbsland::time::TimeOccurrenceInFold : uint8_t
Which local occurrence to choose when a wall clock time appears twice (during the fall-back gap when daylight saving time ends).
When clocks are set back, the same local time occurs twice. This enum disambiguates which occurrence to use.
Values:
-
enumerator First
-
enumerator Second
-
enumerator First
-
struct TimeParts
A wall-clock time split into named parts.
-
class TimePoint
A monotonic time point for measuring elapsed time.
Wraps
std::chrono::steady_clock::time_pointand provides nanosecond-resolution arithmetic for measuring intervals.Public Functions
-
TimePoint() noexcept = default
Create the clock epoch (zero time point).
-
inline explicit TimePoint(std::chrono::steady_clock::time_point value) noexcept
Create from a
std::chrono::steady_clock::time_point.- Parameters:
value – The steady clock time point.
-
inline std::strong_ordering operator<=>(const TimePoint &other) const noexcept
Compare two monotonic time points.
-
inline TimeDelta operator-(const TimePoint &other) const noexcept
Calculate the delta between two time points.
-
inline TimePoint operator-(TimeDelta delta) const noexcept
Return a time point offset backwards by a delta.
-
inline TimePoint &operator-=(TimeDelta delta) noexcept
Offset this time point backwards by a delta.
-
inline TimeDelta timeDeltaTo(const TimePoint &timePoint) const noexcept
Return the time delta to another time point.
- Parameters:
timePoint – The target time point.
- Returns:
The duration from this point to the target.
-
inline TimeDelta timeDeltaToNow() const noexcept
Return the time delta to the current time.
- Returns:
The duration from this point to now.
-
inline std::chrono::steady_clock::time_point toStdTimePoint() const noexcept
Convert to a standard-library steady-clock time point.
-
TimePoint() noexcept = default
-
struct SecondsUnitTag
Unit tag for time amounts measured in seconds and fractions/multiples of seconds.
-
struct MonthsUnitTag
Unit tag for calendar month amounts.
-
struct YearsUnitTag
Unit tag for calendar year amounts.
-
class TimeWithZone
A wall-clock time accompanied by a time zone.
Without a date, a named zone cannot be resolved to a unique UTC offset. Combine this value with a
Dateto construct aDateTimewhen an exact instant is required.See: Date and Time
Public Functions
-
TimeWithZone() noexcept = default
Create midnight UTC.
-
inline TimeWithZone(Time time, TimeZone timeZone = {}) noexcept
Create a time with a zone.
- Parameters:
time – The wall-clock time.
timeZone – The accompanying time zone.
-
inline Milliseconds millisecondFraction() const noexcept
Return the millisecond fraction.
-
inline Nanoseconds nanosecondFraction() const noexcept
Return the nanosecond fraction.
-
TimeWithZone() noexcept = default
-
struct TimeWrapResult
The result of adding to a wall-clock time with wrapping.
-
class TimeZone
A UTC, fixed-offset, or named IANA time zone.
See: Date and Time
Public Functions
-
TimeZone() noexcept = default
Create UTC.
-
explicit TimeZone(Hours hours, Minutes minutes = Minutes{}, Seconds seconds = Seconds{}) noexcept
Create a fixed offset from parts.
The resulting offset is clamped into the range
-23:59:59..+23:59:59. A zero offset creates UTC.- Parameters:
hours – The offset hours. Clamped into the range
-23..+23.minutes – The offset minutes. Clamped into the range
-59..+59.seconds – The offset seconds. Clamped into the range
-59..+59.
-
explicit TimeZone(Duration offset) noexcept
Create a fixed offset.
The offset is normalized into the range
-23:59:59..+23:59:59. A zero offset creates UTC.- Parameters:
offset – The total offset duration.
-
explicit TimeZone(TimeZoneId id) noexcept
Create a named time zone from a transient id.
The UTC and not-found identifiers create UTC.
- Parameters:
id – The time zone identifier.
-
bool isUtc() const noexcept
Test if this zone is UTC.
- Returns:
trueif this is the UTC time zone.
-
bool isStaticOffset() const noexcept
Test if this zone is a fixed non-zero UTC offset.
- Returns:
trueif this is a fixed offset other than UTC.
-
bool isNamed() const noexcept
Test if this zone is a named IANA time zone.
- Returns:
trueif this is a named zone.
-
inline constexpr bool isLocalTime() const noexcept
Test if this zone originated from the system-local setting.
- Returns:
trueif this is the system-local zone.
-
Duration staticOffset() const noexcept
Return the fixed offset, or zero for UTC and named zones.
- Returns:
The fixed offset duration.
-
text::String name() const
Return the primary IANA zone name, or an empty string for UTC and fixed offsets.
- Returns:
The zone name (e.g.
America/New_York).
-
TimeZoneId id() const noexcept
Return the transient time-zone identifier, or the UTC identifier for UTC and fixed offsets.
- Returns:
The zone identifier.
Public Static Functions
-
static bool isValidName(const text::String &name) noexcept
Test if a name is known.
- Parameters:
name – The zone name to check.
- Returns:
trueif the zone is supported.
-
static std::optional<TimeZone> fromName(const text::String &name) noexcept
Create a named zone from a name.
Also accepts special UTC names such as
UTC,GMT,Z, and fixed-offset names such asUTC+02:00.- Parameters:
name – The zone name.
- Returns:
The time zone, or
std::nulloptif unknown.
-
static TimeZone fromNameOrThrow(const text::String &name)
Create a named zone from a name or throw.
Also accepts special UTC names such as
UTC,GMT,Z, and fixed-offset names such asUTC+02:00.- Parameters:
name – The zone name.
- Throws:
err::ParseError – if the zone name is unknown.
- Returns:
The time zone.
-
static text::StringList names()
Return all supported zone names.
- Returns:
A list of all IANA zone names in the bundled database.
-
TimeZone() noexcept = default
-
class TimeZoneId
A transient identifier for a named time zone.
Used internally to reference time zones without storing full name strings.
Public Functions
-
constexpr TimeZoneId() noexcept = default
Create the UTC identifier.
-
inline explicit constexpr TimeZoneId(uint16_t value) noexcept
Create an identifier from its raw value.
- Parameters:
value – The raw identifier value.
-
constexpr std::strong_ordering operator<=>(const TimeZoneId &other) const noexcept = default
Compare identifiers.
-
inline constexpr uint16_t toRawValue() const noexcept
Return the raw identifier.
- Returns:
The underlying identifier value.
-
inline constexpr bool isUtc() const noexcept
Test if this is the UTC/no-zone identifier.
- Returns:
trueif this represents UTC.
-
constexpr TimeZoneId() noexcept = default
-
class TimeOffset
Offset details stored with a date/time value.
Holds the UTC offset, zone identifier, and daylight saving information for a specific point in time.
Public Functions
-
TimeOffset() noexcept = default
Create UTC offset.
-
inline explicit TimeOffset(Seconds offset, bool isLocalTime = false) noexcept
Create a fixed offset.
- Parameters:
offset – The UTC offset.
isLocalTime – Whether the offset originated from the system-local zone.
-
inline TimeOffset(Seconds offset, bool isDst, TimeZoneId zoneId, uint8_t abbreviationId, bool isLocalTime = false) noexcept
Create a named-zone offset.
- Parameters:
offset – The UTC offset.
isDst – Whether daylight saving time is active.
zoneId – The time zone identifier.
abbreviationId – The abbreviation index.
isLocalTime – Whether the offset originated from the system-local zone.
-
inline constexpr bool isUtc() const noexcept
Test if this offset represents UTC without a named zone.
-
inline constexpr bool isStaticOffset() const noexcept
Test if this offset is a fixed non-zero UTC offset.
-
inline constexpr bool isZone() const noexcept
Test if this offset is associated with a named time zone.
-
inline constexpr bool isDst() const noexcept
Test if daylight saving time is active for this offset.
-
inline constexpr bool isLocalTime() const noexcept
Test if this offset originated from the system-local zone.
-
inline constexpr TimeZoneId zoneId() const noexcept
Return the time zone identifier.
-
inline constexpr uint8_t abbreviationId() const noexcept
Return the time zone abbreviation table index.
-
TimeOffset() noexcept = default
-
class Year : public erbsland::time::impl::TimePartWithAmount<Year, Years, int16_t, 0, 9999>
A Gregorian calendar year in the supported range
0...9999.Public Functions
-
bool isLeapYear() const noexcept
Test if this is a leap year in the proleptic Gregorian calendar.
-
Days dayCount() const noexcept
Return the number of days in this year.
- Returns:
366 for leap years, 365 otherwise.
-
Days daysSinceEpoch() const noexcept
Return the number of days from epoch to the first day of this year.
- Returns:
The number of days since the epoch.
-
Days daysBeforeMonth(Month month) const noexcept
Return the number of days before a given month in this year.
- Parameters:
month – The month (1-12).
- Returns:
The cumulative day count before the month starts.
-
Month monthOfDay(DayOfYear dayOfYear) const noexcept
Return the month of the day of year.
- Parameters:
dayOfYear – The day of the year.
- Returns:
The month of that day.
-
Year next() const noexcept
Return the next year, clamped at the supported range.
- Returns:
The following year, or the current year if already at maximum.
-
Year previous() const noexcept
Return the previous year, clamped at the supported range.
- Returns:
The preceding year, or the current year if already at minimum.
-
inline constexpr bool hasNext() const noexcept
Test if this year has a following year in the supported range.
- Returns:
trueif this year is less than 9999.
-
inline constexpr bool hasPrevious() const noexcept
Test if this year has a previous year in the supported range.
- Returns:
trueif this year is greater than 0.
Public Static Functions
-
static YearDayOfYearParts extractFromEpoch(Days days) noexcept
Extract a year and zero-based day-of-year from days since epoch.
Values before the epoch are clamped to
0000-01-01; values after the supported range are clamped to9999-12-31.- Parameters:
days – The number of days since the epoch.
- Returns:
The extracted year and zero-based day-of-year.
-
bool isLeapYear() const noexcept