core/time/datetime
datetime
Types
13Date
Date :: struct {
year: i64,
month: i8,
day: i8,
}SourceA type representing a date.
The minimum and maximum values for a year can be found in MIN_DATE and MAX_DATE constants. The month field can range from 1 to 12, and the day ranges from 1 to however many days there are in the specified month.
DateTime
DateTime :: struct {
date: Date,
time: Time,
tz: ^TZ_Region,
}SourceA type representing datetime.
Delta
Delta :: struct {
days: i64,
seconds: i64,
nanos: i64,
}SourceA type representing a difference between two instances of datetime.
Note: All fields are i64 because we can also use it to add a number of seconds or nanos to a moment, that are then normalized within their respective ranges.
Error
Error :: enum int {
None = 0,
Invalid_Year = 1,
Invalid_Month = 2,
Invalid_Day = 3,
Invalid_Hour = 4,
Invalid_Minute = 5,
Invalid_Second = 6,
Invalid_Nano = 7,
Invalid_Ordinal = 8,
Invalid_Delta = 9,
}SourcePossible errors returned by datetime functions.
Month
Month :: enum i8 {
January = 1,
February = 2,
March = 3,
April = 4,
May = 5,
June = 6,
July = 7,
August = 8,
September = 9,
October = 10,
November = 11,
December = 12,
}SourceType representing one of the months.
Ordinal
Ordinal :: i64SourceType representing a mononotic day number corresponding to a date.
Ordinal 1 = Midnight Monday, January 1, 1 A.D. (Gregorian)
| Midnight Monday, January 3, 1 A.D. (Julian)
Every other ordinal counts days forwards, starting from the above date.TZ_Date_Kind
TZ_Date_Kind :: enum int {
No_Leap = 0,
Leap = 1,
Month_Week_Day = 2,
}SourceTZ_RRule
TZ_RRule :: struct {
has_dst: bool,
std_name: string,
std_offset: i64,
std_date: TZ_Transition_Date,
dst_name: string,
dst_offset: i64,
dst_date: TZ_Transition_Date,
}SourceTZ_Record
TZ_Record :: struct {
time: i64,
utc_offset: i64,
shortname: string,
dst: bool,
}SourceTZ_Region
TZ_Region :: struct {
name: string,
records: []TZ_Record,
shortnames: []string,
rrule: TZ_RRule,
}SourceTZ_Transition_Date
TZ_Transition_Date :: struct {
type: TZ_Date_Kind,
month: u8,
week: u8,
day: u16,
time: i64,
}SourceTime
Time :: struct {
hour: i8,
minute: i8,
second: i8,
nano: i32,
}SourceA type representing a time within a single day within a nanosecond precision.
Weekday
Weekday :: enum i8 {
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6,
}SourceType representing one of the weekdays.
Constants
4MAX_DATE
MAX_DATE :: Date = Date{year = 25_252_734_927_766_552, month = 12, day = 31}SourceMaximum valid value for date
The value is chosen such that a conversion date -> ordinal -> date is always safe.
MAX_ORD
MAX_ORD :: i64 = Ordinal( 9_223_372_036_854_774_869)SourceMaximum value for an ordinal
MIN_DATE
MIN_DATE :: Date = Date{year = -25_252_734_927_766_552, month = 1, day = 1}SourceMinimum valid value for date.
The value is chosen such that a conversion date -> ordinal -> date is always safe.
MIN_ORD
MIN_ORD :: i64 = Ordinal(-9_223_372_036_854_775_234)SourceMinimum value for an ordinal
Procedures
42add_days_to_date
add_days_to_date :: proc(a: Date, days: i64) -> (date: Date, err: Error)SourceAdd certain amount of days to a date.
This procedure adds the specified amount of days to a date and returns a new date. The new date would have happened the specified amount of days after the specified date.
add_delta_to_date
add_delta_to_date :: proc(a: Date, delta: Delta) -> (date: Date, err: Error)SourceAdd delta to a date.
This procedure adds a delta to a date, and returns a new date. The new date would have happened the time specified by delta after the specified date.
Note: The delta is assumed to be normalized. That is, if it contains seconds or milliseconds, regardless of the amount only the days will be added.
add_delta_to_datetime
add_delta_to_datetime :: proc(a: DateTime, delta: Delta) -> (datetime: DateTime, err: Error)SourceAdd delta to datetime.
This procedure adds a delta to a datetime, and returns a new datetime. The new datetime would have happened the time specified by delta after the specified datetime.
adjusted_remainder
adjusted_remainder :: proc(x: i64, b: i64) -> (res: i64)Sourcex mod [1..b]
biggest
biggest :: proc(k: i64, cond: proc(n: i64) -> (bool)) -> (d: i64)Sourcecomponents_to_date
components_to_date :: proc(any_int, any_int, day: i64) -> (date: Date, err: Error)SourceObtain a date from date components.
This procedure converts date components, specified by a year, a month and a day, into a date object. If the provided date components don't represent a valid date, an error is returned.
components_to_datetime
components_to_datetime :: proc(
any_int,
any_int,
any_int,
any_int,
any_int,
second: i64,
nanos: _,
) -> (datetime: DateTime, err: Error)SourceObtain datetime from components.
This procedure converts date components and time components into a datetime object. If the provided date components or time components don't represent a valid datetime, an error is returned.
components_to_ordinal
components_to_ordinal :: proc(any_int, any_int, day: i64) -> (ordinal: Ordinal, err: Error)SourceObtain an ordinal from date components.
This procedure converts the specified date, provided by its individual components, into an ordinal. If the specified date is not a valid date, an error is returned.
components_to_time
components_to_time :: proc(any_int, any_int, second: i64, nanos) -> (time: Time, err: Error)SourceObtain time from time components.
This procedure converts time components, specified by an hour, a minute, a second and nanoseconds, into a time object. If the provided time components don't represent a valid time, an error is returned.
date_to_ordinal
date_to_ordinal :: proc(date: Date) -> (ordinal: Ordinal, err: Error)SourceObtain an ordinal from a date.
This procedure converts the specified date into an ordinal. If the specified date is not a valid date, an error is returned.
day_number
day_number :: proc(date: Date) -> (day_number: i64, err: Error)SourceObtain the day number in a year
This procedure returns the number of the day in a year, starting from 1. If the date is not a valid date, an error is returned.
day_of_week
day_of_week :: proc(ordinal: Ordinal) -> (day: Weekday)SourceCalculate the weekday from an ordinal.
This procedure takes the value of an ordinal and returns the day of week for that ordinal.
days_remaining
days_remaining :: proc(date: Date) -> (days_remaining: i64, err: Error)SourceObtain the remaining number of days in a year.
This procedure returns the number of days between the specified date and December 31 of the same year. If the date is not a valid date, an error is returned.
divmod
divmod :: proc(x: T, y: T, loc = #caller_location) -> (a: T, r: T)SourceCaller has to ensure y != 0
floor_div
floor_div :: proc(x: T, y: T) -> (res: T)SourceDivides and floors
gcd
gcd :: proc(x: i64, y: i64) -> (res: i64)Sourceinterval_mod
interval_mod :: proc(x: i64, a: i64, b: i64) -> (res: i64)SourceHalf open: x mod [1..b]
is_leap_year
is_leap_year :: proc(year: i64) -> (leap: bool)SourceValidation helpers Check if a year is a leap year.
last_day_of_month
last_day_of_month :: proc(year: i64, month: i8) -> (day: i8, err: Error)SourceObtain the last day of a given month on a given year.
This procedure returns the amount of days in a specified month on a specified date. If the specified year or month is not valid, an error is returned.
lcm
lcm :: proc(x: i64, y: i64) -> (res: i64)Sourcenew_year
new_year :: proc(year: i64) -> (new_year: Date, err: Error)SourceObtain the new year date of a given year.
This procedure returns the January 1st date of the specified year. If the year is not valid, an error is returned.
normalize_delta
normalize_delta :: proc(delta: Delta) -> (normalized: Delta, err: Error)SourceNormalize the delta.
This procedure normalizes the delta in such a way that the number of seconds is between 0 and the number of seconds in the day and nanoseconds is between 0 and 10^9.
If the value for days overflows during this operation, an error is returned.
ordinal_to_date
ordinal_to_date :: proc(ordinal: Ordinal) -> (date: Date, err: Error)SourceObtain date using an Ordinal.
This provedure converts the specified ordinal into a date. If the ordinal is not a valid ordinal, an error is returned.
ordinal_to_datetime
ordinal_to_datetime :: proc(ordinal: Ordinal) -> (datetime: DateTime, err: Error)SourceObtain an datetime from an ordinal.
This procedure converts the value of an ordinal into a datetime. Since the ordinal only has the amount of days, the resulting time in the datetime object will always have the time equal to 00:00:00.000.
product
product :: proc(i: i64, f: proc(n: i64) -> (i64), cond: proc(n: i64) -> (bool)) -> (res: i64)Sourcesign
sign :: proc(v: i64) -> (res: i64)Sourcesmallest
smallest :: proc(k: i64, cond: proc(n: i64) -> (bool)) -> (d: i64)Sourcesubtract_dates
subtract_dates :: proc(a: Date, b: Date) -> (delta: Delta, err: Error)SourceCalculate the difference between two dates.
This procedure calculates the difference between two dates a - b, and returns a delta between the two dates in days. If either a or b is not a valid date, an error is returned.
subtract_datetimes
subtract_datetimes :: proc(a: DateTime, b: DateTime) -> (delta: Delta, err: Error)SourceCalculate the difference between two datetimes.
This procedure calculates the difference between two datetimes, a - b, and returns a delta between the two dates. The difference is returned in all three fields of the Delta struct: the difference in days, the difference in seconds and the difference in nanoseconds.
If either a or b is not a valid datetime, an error is returned.
subtract_deltas
subtract_deltas :: proc(a: Delta, b: Delta) -> (delta: Delta, err: Error)SourceCalculate a difference between two deltas.
sum
sum :: proc(i: i64, f: proc(n: i64) -> (i64), cond: proc(n: i64) -> (bool)) -> (res: i64)Sourceunsafe_date_to_ordinal
unsafe_date_to_ordinal :: proc(date: Date) -> (ordinal: Ordinal)SourceThe following procedures don't check whether their inputs are in a valid range. They're still exported for those who know their inputs have been validated. Obtain an ordinal from a date.
This procedure converts a date into an ordinal. If the date is not a valid date, the result is unspecified.
unsafe_ordinal_to_date
unsafe_ordinal_to_date :: proc(ordinal: Ordinal) -> (date: Date)SourceObtain a date from an ordinal.
This procedure converts an ordinal into a date. If the ordinal is outside of its valid range, the result is unspecified.
unsafe_ordinal_to_year
unsafe_ordinal_to_year :: proc(ordinal: Ordinal) -> (year: i64, day_ordinal: i64)SourceObtain a year and a day of the year from an ordinal.
This procedure returns the year and the day of the year of a given ordinal. Of the ordinal is outside of its valid range, the result is unspecified.
validate_date
validate_date :: proc(date: Date) -> (err: Error)SourceCheck for errors in date formation.
This procedure validates all fields of a date, and if any of the fields is outside of allowed range, an error is returned.
validate_datetime
validate_datetime :: proc(datetime: DateTime) -> (err: Error)SourceCheck for errors in datetime formation.
This procedure checks whether all fields of date and time in the specified datetime are valid, and if not, an error is returned.
validate_hour_minute_second
validate_hour_minute_second :: proc(any_int, any_int, any_int, nano: i64) -> (err: Error)SourceCheck for errors in time formed by its components.
This procedure checks whether the time formed by its components is valid, and if not an error is returned.
validate_ordinal
validate_ordinal :: proc(ordinal: Ordinal) -> (err: Error)SourceCheck for errors in Ordinal
This procedure checks if the ordinal is in a valid range for roundtrip conversions with the dates. If not, an error is returned.
validate_time
validate_time :: proc(time: Time) -> (err: Error)SourceCheck for errors in time formation
This procedure checks whether time has all fields in valid ranges, and if not an error is returned.
validate_year_month_day
validate_year_month_day :: proc(any_int, any_int, day: i64) -> (err: Error)SourceCheck for errors in date formation given date components.
This procedure checks whether a date formed by the specified year month and a day is a valid date. If not, an error is returned.
year_end
year_end :: proc(year: i64) -> (year_end: Date, err: Error)SourceObtain the end year of a given date.
This procedure returns the December 31st date of the specified year. If the year is not valid, an error is returned.
year_range
year_range :: proc(year: i64, allocator: mem.Allocator = context.allocator) -> (range: []Date)SourceObtain the range of dates for a given year.
This procedure returns dates, for every day of a given year in a slice.
Procedure Groups
3add
add :: proc{add_days_to_date, add_delta_to_date, add_delta_to_datetime}SourceAdd days to a date, delta to a date or delta to datetime.
sub
sub :: proc{subtract_datetimes, subtract_dates, subtract_deltas}SourceCalculate a difference between two datetimes, dates or deltas.
validate
validate :: proc{validate_date, validate_year_month_day, validate_ordinal, validate_hour_minute_second, validate_time, validate_datetime}SourceCheck for errors in date, time or datetime.