time.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package systeminfo
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. )
  7. // Seconds-based time units
  8. const (
  9. Minute = 60
  10. Hour = 60 * Minute
  11. Day = 24 * Hour
  12. Week = 7 * Day
  13. Month = 30 * Day
  14. Year = 12 * Month
  15. )
  16. func computeTimeDiff(diff int64) (int64, string) {
  17. diffStr := ""
  18. switch {
  19. case diff <= 0:
  20. diff = 0
  21. diffStr = "now"
  22. case diff < 2:
  23. diff = 0
  24. diffStr = "1 second"
  25. case diff < 1*Minute:
  26. diffStr = fmt.Sprintf("%d seconds", diff)
  27. diff = 0
  28. case diff < 2*Minute:
  29. diff -= 1 * Minute
  30. diffStr = "1 minute"
  31. case diff < 1*Hour:
  32. diffStr = fmt.Sprintf("%d minutes", diff/Minute)
  33. diff -= diff / Minute * Minute
  34. case diff < 2*Hour:
  35. diff -= 1 * Hour
  36. diffStr = "1 hour"
  37. case diff < 1*Day:
  38. diffStr = fmt.Sprintf("%d hours", diff/Hour)
  39. diff -= diff / Hour * Hour
  40. case diff < 2*Day:
  41. diff -= 1 * Day
  42. diffStr = "1 day"
  43. case diff < 1*Week:
  44. diffStr = fmt.Sprintf("%d days", diff/Day)
  45. diff -= diff / Day * Day
  46. case diff < 2*Week:
  47. diff -= 1 * Week
  48. diffStr = "1 week"
  49. case diff < 1*Month:
  50. diffStr = fmt.Sprintf("%d weeks", diff/Week)
  51. diff -= diff / Week * Week
  52. case diff < 2*Month:
  53. diff -= 1 * Month
  54. diffStr = "1 month"
  55. case diff < 1*Year:
  56. diffStr = fmt.Sprintf("%d months", diff/Month)
  57. diff -= diff / Month * Month
  58. case diff < 2*Year:
  59. diff -= 1 * Year
  60. diffStr = "1 year"
  61. default:
  62. diffStr = fmt.Sprintf("%d years", diff/Year)
  63. diff = 0
  64. }
  65. return diff, diffStr
  66. }
  67. // TimeSincePro calculates the time interval and generate full user-friendly string.
  68. func TimeSincePro(then time.Time) string {
  69. now := time.Now()
  70. diff := now.Unix() - then.Unix()
  71. if then.After(now) {
  72. return "future"
  73. }
  74. var timeStr, diffStr string
  75. for {
  76. if diff == 0 {
  77. break
  78. }
  79. diff, diffStr = computeTimeDiff(diff)
  80. timeStr += ", " + diffStr
  81. }
  82. return strings.TrimPrefix(timeStr, ", ")
  83. }