@ -4,40 +4,64 @@
package util
import "fmt"
import (
"fmt"
"strings"
)
// SecToTime converts an amount of seconds to a human-readable string (example: 66s -> 1min 6s)
// 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 ( duration int64 ) string {
formattedTime := ""
years := duration / ( 3600 * 24 * 7 * 4 * 12 )
months := ( duration / ( 3600 * 24 * 30 ) ) % 12
weeks := ( duration / ( 3600 * 24 * 7 ) ) % 4
days := ( duration / ( 3600 * 24 ) ) % 7
hours := ( duration / 3600 ) % 24
minutes := ( duration / 60 ) % 60
seconds := duration % 60
minutes := ( duration / ( 60 ) ) % 60
hours := duration / ( 60 * 60 ) % 24
days := duration / ( 60 * 60 ) / 24
var formattedTime string
if days > 0 {
formattedTime = fmt . Sprintf ( "%dd" , days )
}
if hours > 0 {
if formattedTime == "" {
formattedTime = fmt . Sprintf ( "%dh" , hours )
} else {
formattedTime = fmt . Sprintf ( "%s %dh" , formattedTime , hours )
}
}
if minutes > 0 {
if formattedTime == "" {
formattedTime = fmt . Sprintf ( "%dm" , minutes )
} else {
formattedTime = fmt . Sprintf ( "%s %dm" , formattedTime , minutes )
}
// 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 )
}
if seconds > 0 {
if formattedTime == "" {
formattedTime = fmt . Sprintf ( "%ds" , seconds )
} else {
formattedTime = fmt . Sprintf ( "%s %ds" , formattedTime , seconds )
}
// 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