aboutsummaryrefslogtreecommitdiffstats
path: root/modules/util/sec_to_time.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/util/sec_to_time.go')
-rw-r--r--modules/util/sec_to_time.go65
1 files changed, 13 insertions, 52 deletions
diff --git a/modules/util/sec_to_time.go b/modules/util/sec_to_time.go
index ad0fb1a68b..646f33c82a 100644
--- a/modules/util/sec_to_time.go
+++ b/modules/util/sec_to_time.go
@@ -8,61 +8,23 @@ import (
"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)
+// SecToHours converts an amount of seconds to a human-readable hours string.
+// This is stable for planning and managing timesheets.
+// Here it only supports hours and minutes, because a work day could contain 6 or 7 or 8 hours.
+// If the duration is less than 1 minute, it will be shown as seconds.
+func SecToHours(durationVal any) string {
+ seconds, _ := ToInt64(durationVal)
+ hours := seconds / 3600
+ minutes := (seconds / 60) % 60
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)
- }
+ formattedTime = formatTime(hours, "hour", formattedTime)
+ formattedTime = formatTime(minutes, "minute", formattedTime)
// The formatTime() function always appends a space at the end. This will be trimmed
+ if formattedTime == "" && seconds > 0 {
+ formattedTime = formatTime(seconds, "second", "")
+ }
return strings.TrimRight(formattedTime, " ")
}
@@ -76,6 +38,5 @@ func formatTime(value int64, name, formattedTime string) string {
} else if value > 1 {
formattedTime = fmt.Sprintf("%s%d %ss ", formattedTime, value, name)
}
-
return formattedTime
}