diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2024-08-20 18:50:05 +0200 |
|---|---|---|
| committer | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2024-08-20 18:50:05 +0200 |
| commit | daa0779c019738ffe775e80e8c1a4f76cd4b1e0f (patch) | |
| tree | 0c03388fd1e6cfd73147650ed0a805bef1433f44 /core/time | |
| parent | d7e81e86f56eecbc66cb84749a52458881d2a6fd (diff) | |
Rewrite compound_to_time without using i128.
Diffstat (limited to 'core/time')
| -rw-r--r-- | core/time/time.odin | 15 |
1 files 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 + } + if seconds > 9223372036 || (seconds == 9223372036 && delta.nanos > 854775807) { return {}, false } - return Time{_nsec=i64(nanoseconds)}, true + return Time{_nsec=seconds * 1e9 + delta.nanos}, true } /* |