Skip to content

Commit bb59230

Browse files
committed
Fix display since time round
1 parent 41c0776 commit bb59230

File tree

2 files changed

+74
-29
lines changed

2 files changed

+74
-29
lines changed

modules/timeutil/since.go

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package timeutil
77
import (
88
"fmt"
99
"html/template"
10+
"math"
1011
"strings"
1112
"time"
1213

@@ -21,10 +22,14 @@ const (
2122
Hour = 60 * Minute
2223
Day = 24 * Hour
2324
Week = 7 * Day
24-
Month = 30 * Day
25-
Year = 12 * Month
25+
Year = 365*Day + 5*Hour + 48*Minute + 46 // 365d5h48m46s ref. https://pumas.nasa.gov/files/04_21_97_1.pdf
26+
Month = Year / 12
2627
)
2728

29+
func round(s float64) int64 {
30+
return int64(math.Round(s))
31+
}
32+
2833
func computeTimeDiff(diff int64, lang string) (int64, string) {
2934
diffStr := ""
3035
switch {
@@ -38,46 +43,76 @@ func computeTimeDiff(diff int64, lang string) (int64, string) {
3843
diffStr = i18n.Tr(lang, "tool.seconds", diff)
3944
diff = 0
4045

41-
case diff < 2*Minute:
46+
case diff < Minute+Minute/2:
4247
diff -= 1 * Minute
4348
diffStr = i18n.Tr(lang, "tool.1m")
4449
case diff < 1*Hour:
45-
diffStr = i18n.Tr(lang, "tool.minutes", diff/Minute)
50+
minutes := round(float64(diff) / Minute)
51+
if minutes > 1 {
52+
diffStr = i18n.Tr(lang, "tool.minutes", minutes)
53+
} else {
54+
diffStr = i18n.Tr(lang, "tool.1m")
55+
}
4656
diff -= diff / Minute * Minute
4757

48-
case diff < 2*Hour:
58+
case diff < Hour+Hour/2:
4959
diff -= 1 * Hour
5060
diffStr = i18n.Tr(lang, "tool.1h")
5161
case diff < 1*Day:
52-
diffStr = i18n.Tr(lang, "tool.hours", diff/Hour)
62+
hours := round(float64(diff) / Hour)
63+
if hours > 1 {
64+
diffStr = i18n.Tr(lang, "tool.hours", hours)
65+
} else {
66+
diffStr = i18n.Tr(lang, "tool.1h")
67+
}
5368
diff -= diff / Hour * Hour
5469

55-
case diff < 2*Day:
70+
case diff < Day+Day/2:
5671
diff -= 1 * Day
5772
diffStr = i18n.Tr(lang, "tool.1d")
5873
case diff < 1*Week:
59-
diffStr = i18n.Tr(lang, "tool.days", diff/Day)
74+
days := round(float64(diff) / Day)
75+
if days > 1 {
76+
diffStr = i18n.Tr(lang, "tool.days", days)
77+
} else {
78+
diffStr = i18n.Tr(lang, "tool.1d")
79+
}
6080
diff -= diff / Day * Day
6181

62-
case diff < 2*Week:
82+
case diff < Week+Week/2:
6383
diff -= 1 * Week
6484
diffStr = i18n.Tr(lang, "tool.1w")
6585
case diff < 1*Month:
66-
diffStr = i18n.Tr(lang, "tool.weeks", diff/Week)
86+
weeks := round(float64(diff) / Week)
87+
if weeks > 1 {
88+
diffStr = i18n.Tr(lang, "tool.weeks", weeks)
89+
} else {
90+
diffStr = i18n.Tr(lang, "tool.1w")
91+
}
6792
diff -= diff / Week * Week
6893

69-
case diff < 2*Month:
94+
case diff < 1*Month+Month/2:
7095
diff -= 1 * Month
7196
diffStr = i18n.Tr(lang, "tool.1mon")
7297
case diff < 1*Year:
73-
diffStr = i18n.Tr(lang, "tool.months", diff/Month)
98+
months := round(float64(diff) / Month)
99+
if months > 1 {
100+
diffStr = i18n.Tr(lang, "tool.months", months)
101+
} else {
102+
diffStr = i18n.Tr(lang, "tool.1mon")
103+
}
74104
diff -= diff / Month * Month
75105

76-
case diff < 2*Year:
106+
case diff < Year+Year/2:
77107
diff -= 1 * Year
78108
diffStr = i18n.Tr(lang, "tool.1y")
79109
default:
80-
diffStr = i18n.Tr(lang, "tool.years", diff/Year)
110+
years := round(float64(diff) / Year)
111+
if years > 1 {
112+
diffStr = i18n.Tr(lang, "tool.years", years)
113+
} else {
114+
diffStr = i18n.Tr(lang, "tool.1y")
115+
}
81116
diff -= (diff / Year) * Year
82117
}
83118
return diff, diffStr

modules/timeutil/since_test.go

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package timeutil
66

77
import (
8+
"fmt"
89
"os"
910
"testing"
1011
"time"
@@ -124,26 +125,35 @@ func TestComputeTimeDiff(t *testing.T) {
124125
// computeTimeDiff(base + offset) == (offset, str)
125126
test := func(base int64, str string, offsets ...int64) {
126127
for _, offset := range offsets {
127-
diff, diffStr := computeTimeDiff(base+offset, "en")
128-
assert.Equal(t, offset, diff)
129-
assert.Equal(t, str, diffStr)
128+
t.Run(fmt.Sprintf("%s:%d", str, offset), func(t *testing.T) {
129+
diff, diffStr := computeTimeDiff(base+offset, "en")
130+
assert.Equal(t, offset, diff)
131+
assert.Equal(t, str, diffStr)
132+
})
130133
}
131134
}
132135
test(0, "now", 0)
133136
test(1, "1 second", 0)
134137
test(2, "2 seconds", 0)
135-
test(Minute, "1 minute", 0, 1, 30, Minute-1)
136-
test(2*Minute, "2 minutes", 0, Minute-1)
137-
test(Hour, "1 hour", 0, 1, Hour-1)
138-
test(5*Hour, "5 hours", 0, Hour-1)
139-
test(Day, "1 day", 0, 1, Day-1)
140-
test(5*Day, "5 days", 0, Day-1)
141-
test(Week, "1 week", 0, 1, Week-1)
142-
test(3*Week, "3 weeks", 0, 4*Day+25000)
143-
test(Month, "1 month", 0, 1, Month-1)
144-
test(10*Month, "10 months", 0, Month-1)
145-
test(Year, "1 year", 0, Year-1)
146-
test(3*Year, "3 years", 0, Year-1)
138+
test(Minute, "1 minute", 0, 1, 29)
139+
test(Minute, "2 minutes", 30, Minute-1)
140+
test(2*Minute, "2 minutes", 0, 29)
141+
test(2*Minute, "3 minutes", 30, Minute-1)
142+
test(Hour, "1 hour", 0, 1, 29*Minute)
143+
test(Hour, "2 hours", 30*Minute, Hour-1)
144+
test(5*Hour, "5 hours", 0, 29*Minute)
145+
test(Day, "1 day", 0, 1, 11*Hour)
146+
test(Day, "2 days", 12*Hour, Day-1)
147+
test(5*Day, "5 days", 0, 11*Hour)
148+
test(Week, "1 week", 0, 1, 3*Day)
149+
test(Week, "2 weeks", 4*Day, Week-1)
150+
test(3*Week, "3 weeks", 0, 3*Day)
151+
test(Month, "1 month", 0, 1)
152+
test(Month, "2 months", 16*Day, Month-1)
153+
test(10*Month, "10 months", 0, 13*Day)
154+
test(Year, "1 year", 0, 182*Day)
155+
test(Year, "2 years", 184*Day, Year-1)
156+
test(3*Year, "3 years", 0, 182*Day)
147157
}
148158

149159
func TestMinutesToFriendly(t *testing.T) {

0 commit comments

Comments
 (0)