summaryrefslogtreecommitdiffstats
path: root/modules/util/sec_to_time.go
diff options
context:
space:
mode:
authorDaniel Baumann <daniel@debian.org>2024-10-18 20:33:49 +0200
committerDaniel Baumann <daniel@debian.org>2024-12-12 23:57:56 +0100
commite68b9d00a6e05b3a941f63ffb696f91e554ac5ec (patch)
tree97775d6c13b0f416af55314eb6a89ef792474615 /modules/util/sec_to_time.go
parentInitial commit. (diff)
downloadforgejo-e68b9d00a6e05b3a941f63ffb696f91e554ac5ec.tar.xz
forgejo-e68b9d00a6e05b3a941f63ffb696f91e554ac5ec.zip
Adding upstream version 9.0.3.
Signed-off-by: Daniel Baumann <daniel@debian.org>
Diffstat (limited to 'modules/util/sec_to_time.go')
-rw-r--r--modules/util/sec_to_time.go81
1 files changed, 81 insertions, 0 deletions
diff --git a/modules/util/sec_to_time.go b/modules/util/sec_to_time.go
new file mode 100644
index 0000000..ad0fb1a
--- /dev/null
+++ b/modules/util/sec_to_time.go
@@ -0,0 +1,81 @@
+// Copyright 2022 Gitea. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package util
+
+import (
+ "fmt"
+ "strings"
+)
+
+// SecToTime converts an amount of seconds to a human-readable string. E.g.
+// 66s -> 1 minute 6 seconds
+// 52410s -> 14 hours 33 minutes
+// 563418 -> 6 days 12 hours
+// 1563418 -> 2 weeks 4 days
+// 3937125s -> 1 month 2 weeks
+// 45677465s -> 1 year 6 months
+func SecToTime(durationVal any) string {
+ duration, _ := ToInt64(durationVal)
+
+ formattedTime := ""
+
+ // The following four variables are calculated by taking
+ // into account the previously calculated variables, this avoids
+ // pitfalls when using remainders. As that could lead to incorrect
+ // results when the calculated number equals the quotient number.
+ remainingDays := duration / (60 * 60 * 24)
+ years := remainingDays / 365
+ remainingDays -= years * 365
+ months := remainingDays * 12 / 365
+ remainingDays -= months * 365 / 12
+ weeks := remainingDays / 7
+ remainingDays -= weeks * 7
+ days := remainingDays
+
+ // The following three variables are calculated without depending
+ // on the previous calculated variables.
+ hours := (duration / 3600) % 24
+ minutes := (duration / 60) % 60
+ seconds := duration % 60
+
+ // Extract only the relevant information of the time
+ // If the time is greater than a year, it makes no sense to display seconds.
+ switch {
+ case years > 0:
+ formattedTime = formatTime(years, "year", formattedTime)
+ formattedTime = formatTime(months, "month", formattedTime)
+ case months > 0:
+ formattedTime = formatTime(months, "month", formattedTime)
+ formattedTime = formatTime(weeks, "week", formattedTime)
+ case weeks > 0:
+ formattedTime = formatTime(weeks, "week", formattedTime)
+ formattedTime = formatTime(days, "day", formattedTime)
+ case days > 0:
+ formattedTime = formatTime(days, "day", formattedTime)
+ formattedTime = formatTime(hours, "hour", formattedTime)
+ case hours > 0:
+ formattedTime = formatTime(hours, "hour", formattedTime)
+ formattedTime = formatTime(minutes, "minute", formattedTime)
+ default:
+ formattedTime = formatTime(minutes, "minute", formattedTime)
+ formattedTime = formatTime(seconds, "second", formattedTime)
+ }
+
+ // The formatTime() function always appends a space at the end. This will be trimmed
+ return strings.TrimRight(formattedTime, " ")
+}
+
+// formatTime appends the given value to the existing forammattedTime. E.g:
+// formattedTime = "1 year"
+// input: value = 3, name = "month"
+// output will be "1 year 3 months "
+func formatTime(value int64, name, formattedTime string) string {
+ if value == 1 {
+ formattedTime = fmt.Sprintf("%s1 %s ", formattedTime, name)
+ } else if value > 1 {
+ formattedTime = fmt.Sprintf("%s%d %ss ", formattedTime, value, name)
+ }
+
+ return formattedTime
+}