constants.odin 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package datetime
  2. // Ordinal 1 = Midnight Monday, January 1, 1 A.D. (Gregorian)
  3. // | Midnight Monday, January 3, 1 A.D. (Julian)
  4. Ordinal :: i64
  5. EPOCH :: Ordinal(1)
  6. // Minimum and maximum dates and ordinals. Chosen for safe roundtripping.
  7. MIN_DATE :: Date{year = -25_252_734_927_766_552, month = 1, day = 1}
  8. MAX_DATE :: Date{year = 25_252_734_927_766_552, month = 12, day = 31}
  9. MIN_ORD :: Ordinal(-9_223_372_036_854_775_234)
  10. MAX_ORD :: Ordinal( 9_223_372_036_854_774_869)
  11. Error :: enum {
  12. None,
  13. Invalid_Year,
  14. Invalid_Month,
  15. Invalid_Day,
  16. Invalid_Hour,
  17. Invalid_Minute,
  18. Invalid_Second,
  19. Invalid_Nano,
  20. Invalid_Ordinal,
  21. Invalid_Delta,
  22. }
  23. Date :: struct {
  24. year: i64,
  25. month: i8,
  26. day: i8,
  27. }
  28. Time :: struct {
  29. hour: i8,
  30. minute: i8,
  31. second: i8,
  32. nano: i32,
  33. }
  34. DateTime :: struct {
  35. using date: Date,
  36. using time: Time,
  37. }
  38. Delta :: struct {
  39. days: i64, // These are all i64 because we can also use it to add a number of seconds or nanos to a moment,
  40. seconds: i64, // that are then normalized within their respective ranges.
  41. nanos: i64,
  42. }
  43. Month :: enum i8 {
  44. January = 1,
  45. February,
  46. March,
  47. April,
  48. May,
  49. June,
  50. July,
  51. August,
  52. September,
  53. October,
  54. November,
  55. December,
  56. }
  57. Weekday :: enum i8 {
  58. Sunday = 0,
  59. Monday,
  60. Tuesday,
  61. Wednesday,
  62. Thursday,
  63. Friday,
  64. Saturday,
  65. }
  66. @(private)
  67. MONTH_DAYS :: [?]i8{-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}