elapsed.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // Copyright (c) 2017 Hervé Gouchet. All rights reserved.
  2. // Use of this source code is governed by the MIT License
  3. // that can be found in the LICENSE file.
  4. package template
  5. import (
  6. "math"
  7. "time"
  8. "github.com/miniflux/miniflux/locale"
  9. "github.com/miniflux/miniflux/timezone"
  10. )
  11. // Texts to be translated if necessary.
  12. var (
  13. NotYet = `not yet`
  14. JustNow = `just now`
  15. LastMinute = `1 minute ago`
  16. Minutes = `%d minutes ago`
  17. LastHour = `1 hour ago`
  18. Hours = `%d hours ago`
  19. Yesterday = `yesterday`
  20. Days = `%d days ago`
  21. Weeks = `%d weeks ago`
  22. Months = `%d months ago`
  23. Years = `%d years ago`
  24. )
  25. // ElapsedTime returns in a human readable format the elapsed time
  26. // since the given datetime.
  27. func elapsedTime(language *locale.Language, tz string, t time.Time) string {
  28. if t.IsZero() {
  29. return language.Get(NotYet)
  30. }
  31. now := timezone.Now(tz)
  32. t = timezone.Convert(tz, t)
  33. if now.Before(t) {
  34. return language.Get(NotYet)
  35. }
  36. diff := now.Sub(t)
  37. // Duration in seconds
  38. s := diff.Seconds()
  39. // Duration in days
  40. d := int(s / 86400)
  41. switch {
  42. case s < 60:
  43. return language.Get(JustNow)
  44. case s < 120:
  45. return language.Get(LastMinute)
  46. case s < 3600:
  47. return language.Get(Minutes, int(diff.Minutes()))
  48. case s < 7200:
  49. return language.Get(LastHour)
  50. case s < 86400:
  51. return language.Get(Hours, int(diff.Hours()))
  52. case d == 1:
  53. return language.Get(Yesterday)
  54. case d < 7:
  55. return language.Get(Days, d)
  56. case d < 31:
  57. return language.Get(Weeks, int(math.Ceil(float64(d)/7)))
  58. case d < 365:
  59. return language.Get(Months, int(math.Ceil(float64(d)/30)))
  60. default:
  61. return language.Get(Years, int(math.Ceil(float64(d)/365)))
  62. }
  63. }