2022-10-27 16:00:57 +02:00
|
|
|
package timeext
|
|
|
|
|
2022-10-27 16:48:26 +02:00
|
|
|
import (
|
|
|
|
"fmt"
|
2022-11-30 22:09:54 +01:00
|
|
|
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
2022-10-27 16:48:26 +02:00
|
|
|
"time"
|
|
|
|
)
|
2022-10-27 16:00:57 +02:00
|
|
|
|
2022-11-30 22:09:54 +01:00
|
|
|
func FromNanoseconds[T langext.NumberConstraint](v T) time.Duration {
|
|
|
|
return time.Duration(int64(float64(v) * float64(time.Nanosecond)))
|
2022-10-27 16:00:57 +02:00
|
|
|
}
|
|
|
|
|
2022-11-30 22:09:54 +01:00
|
|
|
func FromMicroseconds[T langext.NumberConstraint](v T) time.Duration {
|
|
|
|
return time.Duration(int64(float64(v) * float64(time.Microsecond)))
|
2022-10-27 16:00:57 +02:00
|
|
|
}
|
|
|
|
|
2022-11-30 22:09:54 +01:00
|
|
|
func FromMilliseconds[T langext.NumberConstraint](v T) time.Duration {
|
|
|
|
return time.Duration(int64(float64(v) * float64(time.Millisecond)))
|
2022-10-27 16:00:57 +02:00
|
|
|
}
|
|
|
|
|
2022-11-30 22:09:54 +01:00
|
|
|
func FromSeconds[T langext.NumberConstraint](v T) time.Duration {
|
|
|
|
return time.Duration(int64(float64(v) * float64(time.Second)))
|
2022-10-27 16:00:57 +02:00
|
|
|
}
|
|
|
|
|
2022-11-30 22:09:54 +01:00
|
|
|
func FromMinutes[T langext.NumberConstraint](v T) time.Duration {
|
|
|
|
return time.Duration(int64(float64(v) * float64(time.Minute)))
|
2022-10-27 16:00:57 +02:00
|
|
|
}
|
|
|
|
|
2022-11-30 22:09:54 +01:00
|
|
|
func FromHours[T langext.NumberConstraint](v T) time.Duration {
|
|
|
|
return time.Duration(int64(float64(v) * float64(time.Hour)))
|
2022-10-27 16:00:57 +02:00
|
|
|
}
|
|
|
|
|
2022-11-30 22:09:54 +01:00
|
|
|
func FromDays[T langext.NumberConstraint](v T) time.Duration {
|
|
|
|
return time.Duration(int64(float64(v) * float64(24) * float64(time.Hour)))
|
2022-10-27 16:00:57 +02:00
|
|
|
}
|
2022-10-27 16:48:26 +02:00
|
|
|
|
|
|
|
func FormatNaturalDurationEnglish(iv time.Duration) string {
|
|
|
|
if sec := int64(iv.Seconds()); sec < 180 {
|
|
|
|
if sec == 1 {
|
|
|
|
return "1 second ago"
|
|
|
|
} else {
|
|
|
|
return fmt.Sprintf("%d seconds ago", sec)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if min := int64(iv.Minutes()); min < 180 {
|
|
|
|
return fmt.Sprintf("%d minutes ago", min)
|
|
|
|
}
|
|
|
|
|
|
|
|
if hours := int64(iv.Hours()); hours < 72 {
|
|
|
|
return fmt.Sprintf("%d hours ago", hours)
|
|
|
|
}
|
|
|
|
|
|
|
|
if days := int64(iv.Hours() / 24.0); days < 21 {
|
|
|
|
return fmt.Sprintf("%d days ago", days)
|
|
|
|
}
|
|
|
|
|
|
|
|
if weeks := int64(iv.Hours() / 24.0 / 7.0); weeks < 12 {
|
|
|
|
return fmt.Sprintf("%d weeks ago", weeks)
|
|
|
|
}
|
|
|
|
|
|
|
|
if months := int64(iv.Hours() / 24.0 / 7.0 / 30); months < 36 {
|
|
|
|
return fmt.Sprintf("%d months ago", months)
|
|
|
|
}
|
|
|
|
|
|
|
|
years := int64(iv.Hours() / 24.0 / 7.0 / 365)
|
|
|
|
return fmt.Sprintf("%d years ago", years)
|
|
|
|
}
|