mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-30 18:02:02 +00:00
77 lines
1.4 KiB
Odin
77 lines
1.4 KiB
Odin
package datetime
|
|
|
|
// Ordinal 1 = Midnight Monday, January 1, 1 A.D. (Gregorian)
|
|
// | Midnight Monday, January 3, 1 A.D. (Julian)
|
|
Ordinal :: i64
|
|
EPOCH :: Ordinal(1)
|
|
|
|
// Minimum and maximum dates and ordinals. Chosen for safe roundtripping.
|
|
MIN_DATE :: Date{year = -25_252_734_927_766_552, month = 1, day = 1}
|
|
MAX_DATE :: Date{year = 25_252_734_927_766_552, month = 12, day = 31}
|
|
MIN_ORD :: Ordinal(-9_223_372_036_854_775_234)
|
|
MAX_ORD :: Ordinal( 9_223_372_036_854_774_869)
|
|
|
|
Error :: enum {
|
|
None,
|
|
Invalid_Year,
|
|
Invalid_Month,
|
|
Invalid_Day,
|
|
Invalid_Hour,
|
|
Invalid_Minute,
|
|
Invalid_Second,
|
|
Invalid_Nano,
|
|
Invalid_Ordinal,
|
|
Invalid_Delta,
|
|
}
|
|
|
|
Date :: struct {
|
|
year: i64,
|
|
month: i8,
|
|
day: i8,
|
|
}
|
|
|
|
Time :: struct {
|
|
hour: i8,
|
|
minute: i8,
|
|
second: i8,
|
|
nano: i32,
|
|
}
|
|
|
|
DateTime :: struct {
|
|
using date: Date,
|
|
using time: Time,
|
|
}
|
|
|
|
Delta :: struct {
|
|
days: i64, // These are all i64 because we can also use it to add a number of seconds or nanos to a moment,
|
|
seconds: i64, // that are then normalized within their respective ranges.
|
|
nanos: i64,
|
|
}
|
|
|
|
Month :: enum i8 {
|
|
January = 1,
|
|
February,
|
|
March,
|
|
April,
|
|
May,
|
|
June,
|
|
July,
|
|
August,
|
|
September,
|
|
October,
|
|
November,
|
|
December,
|
|
}
|
|
|
|
Weekday :: enum i8 {
|
|
Sunday = 0,
|
|
Monday,
|
|
Tuesday,
|
|
Wednesday,
|
|
Thursday,
|
|
Friday,
|
|
Saturday,
|
|
}
|
|
|
|
@(private)
|
|
MONTH_DAYS :: [?]i8{-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} |