aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/time/datetime/constants.odin6
-rw-r--r--core/time/datetime/datetime.odin15
2 files changed, 9 insertions, 12 deletions
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,12 +5,10 @@ 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)
-*/
-Ordinal :: i64
-/*
+Every other ordinal counts days forwards, starting from the above date.
*/
-EPOCH :: Ordinal(1)
+Ordinal :: i64
/*
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)