aboutsummaryrefslogtreecommitdiff
path: root/core/time/datetime/constants.odin
blob: a2a02838c87563a243831c48854be727cfade3fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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}