From daa0779c019738ffe775e80e8c1a4f76cd4b1e0f Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 20 Aug 2024 18:50:05 +0200 Subject: [PATCH] Rewrite compound_to_time without using i128. --- core/time/time.odin | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/core/time/time.odin b/core/time/time.odin index 4612c28e6..5903b212d 100644 --- a/core/time/time.odin +++ b/core/time/time.odin @@ -932,18 +932,21 @@ as the second return value. See `Time` for the representable range. compound_to_time :: proc "contextless" (datetime: dt.DateTime) -> (t: Time, ok: bool) { unix_epoch := dt.DateTime{{1970, 1, 1}, {0, 0, 0, 0}} delta, err := dt.sub(datetime, unix_epoch) - ok = err == .None - - seconds := delta.days * 86_400 + delta.seconds - nanoseconds := i128(seconds) * 1e9 + i128(delta.nanos) + if err != .None { + return + } + seconds := delta.days * 86_400 + delta.seconds // Can this moment be represented in i64 worth of nanoseconds? // min(Time): 1677-09-21 00:12:44.145224192 +0000 UTC // max(Time): 2262-04-11 23:47:16.854775807 +0000 UTC - if nanoseconds < i128(min(i64)) || nanoseconds > i128(max(i64)) { + if seconds < -9223372036 || (seconds == -9223372036 && delta.nanos < -854775808) { return {}, false } - return Time{_nsec=i64(nanoseconds)}, true + if seconds > 9223372036 || (seconds == 9223372036 && delta.nanos > 854775807) { + return {}, false + } + return Time{_nsec=seconds * 1e9 + delta.nanos}, true } /*