2
0
Эх сурвалжийг харах

add julian day rule resolvers

Colin Davidson 11 сар өмнө
parent
commit
5bf8852b2e

+ 27 - 8
core/time/timezone/tzdate.odin

@@ -84,17 +84,18 @@ month_to_seconds :: proc(month: int, is_leap: bool) -> i64 {
 @private
 trans_date_to_seconds :: proc(year: i64, td: datetime.TZ_Transition_Date) -> (secs: i64, ok: bool) {
 	is_leap := datetime.is_leap_year(year)
-	ONE_DAY :: 86_400
+	DAY_SEC :: 86_400
 
-	#partial switch td.type {
-	case .Month_Week_Day:
-		year_start := datetime.DateTime{{year, 1, 1}, {0, 0, 0, 0}, nil}
-		year_start_time := time.datetime_to_time(year_start) or_return
+	year_start := datetime.DateTime{{year, 1, 1}, {0, 0, 0, 0}, nil}
+	year_start_time := time.datetime_to_time(year_start) or_return
+
+	t := i64(time.to_unix_seconds(year_start_time))
 
-		t := i64(time.to_unix_seconds(year_start_time))
+	switch td.type {
+	case .Month_Week_Day:
 		t += month_to_seconds(int(td.month) - 1, is_leap)
 
-		weekday := ((t + (4 * ONE_DAY)) %% (7 * ONE_DAY)) / ONE_DAY
+		weekday := ((t + (4 * DAY_SEC)) %% (7 * DAY_SEC)) / DAY_SEC
 		days := i64(td.day) - weekday
 		if days < 0 { days += 7 }
 
@@ -106,10 +107,28 @@ trans_date_to_seconds :: proc(year: i64, td: datetime.TZ_Transition_Date) -> (se
 			week = 4
 		}
 
-		t += 86_400 * (days + (7 * i64(week - 1)))
+		t += DAY_SEC * (days + (7 * i64(week - 1)))
 		t += td.time
 
 		return t, true
+
+	// Both of these should result in 0 -> 365 days (in seconds)
+	case .No_Leap:
+		day := i64(td.day)
+
+		// if before Feb 29th || not a leap year
+		if day < 60 || !is_leap {
+			day -= 1
+		}
+		t += DAY_SEC * day
+
+		return t, true
+
+	case .Leap:
+		t += DAY_SEC * i64(td.day)
+
+		return t, true
+
 	case:
 		return
 	}