From 4cb5949d1495fe47bfda85f3590a11b3a663717d Mon Sep 17 00:00:00 2001 From: Henrik Holst <6200749+hholst80@users.noreply.github.com> Date: Fri, 3 May 2024 10:51:42 -0400 Subject: [PATCH] time: fix the string representation of a negative Duration (#21407) --- vlib/time/duration.v | 17 +++++++++++------ vlib/time/duration_test.v | 8 ++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/vlib/time/duration.v b/vlib/time/duration.v index bd7f947061..cfa58d06e7 100644 --- a/vlib/time/duration.v +++ b/vlib/time/duration.v @@ -63,7 +63,12 @@ pub fn (d Duration) str() string { if d == time.infinite { return 'inf' } + mut sign := '' mut t := i64(d) + if t < 0 { + sign = '-' + t = -t + } hr := t / time.hour t -= hr * time.hour min := t / time.minute @@ -77,12 +82,12 @@ pub fn (d Duration) str() string { ns := t return match true { - hr > 0 { '${hr}:${min:02}:${sec:02}' } - min > 0 { '${min}:${sec:02}.${ms:03}' } - sec > 0 { '${sec}.${ms:03}s' } - ms > 0 { '${ms}.${us:03}ms' } - us > 0 { '${us}.${ns:03}us' } - else { '${ns}ns' } + hr > 0 { '${sign}${hr}:${min:02}:${sec:02}' } + min > 0 { '${sign}${min}:${sec:02}.${ms:03}' } + sec > 0 { '${sign}${sec}.${ms:03}s' } + ms > 0 { '${sign}${ms}.${us:03}ms' } + us > 0 { '${sign}${us}.${ns:03}us' } + else { '${sign}${ns}ns' } } } diff --git a/vlib/time/duration_test.v b/vlib/time/duration_test.v index 9732c43ed7..66f6599b2d 100644 --- a/vlib/time/duration_test.v +++ b/vlib/time/duration_test.v @@ -32,6 +32,14 @@ fn test_duration_str() { assert time.Duration(168 * time.hour + 5 * time.minute + 7 * time.second).str() == '168:05:07' } +fn test_negative_duration() { + now := time.parse('2000-01-01 10:00:00')! + later := time.parse('2000-01-01 11:00:00')! + duration := now - later + assert time.Duration(-1 * time.hour) == duration + assert duration.str() == '-1:00:00' +} + fn test_duration_debug() { assert time.Duration(1 * time.nanosecond).debug() == 'Duration: 1ns' assert time.Duration(169 * time.hour + 5 * time.minute + 7 * time.second).debug() == 'Duration: 7days, 1h, 5m, 7s'