From c9ca192f33411a6be611970401897f68ae5cf7d7 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 10 Aug 2024 03:23:08 +0200 Subject: [PATCH] Add time.precise_clock_from_time + time.precise_clock_from_duration --- core/time/time.odin | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/core/time/time.odin b/core/time/time.odin index e4ec67be3..3d8cc6537 100644 --- a/core/time/time.odin +++ b/core/time/time.odin @@ -348,7 +348,33 @@ clock :: proc { clock_from_time, clock_from_duration, clock_from_stopwatch } Obtain the time components from a time. */ clock_from_time :: proc "contextless" (t: Time) -> (hour, min, sec: int) { - return clock_from_seconds(_time_abs(t)) + hour, min, sec, _ = precise_clock_from_time(t) + return +} + +/* +Obtain the time components from a time, including nanoseconds. +*/ +precise_clock_from_time :: proc "contextless" (t: Time) -> (hour, min, sec, nanos: int) { + // Time in nanoseconds since 1-1-1970 00:00 + nanos = int(t._nsec) + // Time in seconds + sec = nanos / 1e9 + // Remaining nanoseconds after whole seconds subtracted + nanos -= sec * 1e9 + // Add offset to seconds + sec += int(UNIX_TO_ABSOLUTE) + // Divide out the days and just keep the seconds within the day + sec %= 86_400 + // How many hours in those seconds? + hour = sec / 3_600 + // Remove those hourly seconds + sec -= hour * 3_600 + // How many minutes left? + min = sec / 60 + // Subtract minutely seconds + sec -= min * 60 + return } /* @@ -358,6 +384,13 @@ clock_from_duration :: proc "contextless" (d: Duration) -> (hour, min, sec: int) return clock_from_seconds(u64(d/1e9)) } +/* +Obtain the time components from a duration, including nanoseconds. +*/ +precise_clock_from_duration :: proc "contextless" (d: Duration) -> (hour, min, sec, nanos: int) { + return precise_clock_from_time({_nsec=i64(d)}) +} + /* Obtain the time components from a stopwatch's total. */