diff --git a/core/time/datetime/constants.odin b/core/time/datetime/constants.odin index e24709e49..b4fb4a15f 100644 --- a/core/time/datetime/constants.odin +++ b/core/time/datetime/constants.odin @@ -5,13 +5,11 @@ Type 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. */ Ordinal :: i64 -/* -*/ -EPOCH :: Ordinal(1) - /* Minimum valid value for date. diff --git a/core/time/datetime/datetime.odin b/core/time/datetime/datetime.odin index 2cd90b0e7..f52bff9b6 100644 --- a/core/time/datetime/datetime.odin +++ b/core/time/datetime/datetime.odin @@ -98,7 +98,7 @@ This procedure takes the value of an ordinal and returns the day of week for that ordinal. */ day_of_week :: proc "contextless" (ordinal: Ordinal) -> (day: Weekday) { - return Weekday((ordinal - EPOCH + 1) %% 7) + return Weekday(ordinal %% 7) } /* @@ -349,8 +349,7 @@ the result is unspecified. unsafe_date_to_ordinal :: proc "contextless" (date: Date) -> (ordinal: Ordinal) { year_minus_one := date.year - 1 - // Day before epoch - ordinal = EPOCH - 1 + ordinal = 0 // Add non-leap days ordinal += 365 * year_minus_one @@ -382,17 +381,17 @@ 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. */ unsafe_ordinal_to_year :: proc "contextless" (ordinal: Ordinal) -> (year: i64, day_ordinal: i64) { - // Days after epoch - d0 := ordinal - EPOCH + // Correct for leap year cycle starting at day 1. + d0 := ordinal - 1 // Number of 400-year cycles and remainder - n400, d1 := divmod(d0, 146097) + n400, d1 := divmod(d0, 365*400 + 100 - 3) // Number of 100-year cycles and remainder - n100, d2 := divmod(d1, 36524) + n100, d2 := divmod(d1, 365*100 + 25 - 1) // Number of 4-year cycles and remainder - n4, d3 := divmod(d2, 1461) + n4, d3 := divmod(d2, 365*4 + 1) // Number of remaining days n1, d4 := divmod(d3, 365)