-
Notifications
You must be signed in to change notification settings - Fork 2
/
time.go
124 lines (112 loc) · 4.61 KB
/
time.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//Package prettytime provides utility functions for calculating and presenting
//in human readable and understandable form.
package prettytime
import (
"strconv"
"strings"
"time"
"github.com/BurntSushi/toml"
"github.com/nicksnyder/go-i18n/v2/i18n"
"golang.org/x/text/language"
)
const (
// Unix epoch (or Unix time or POSIX time or Unix timestamp) 1 year (365.24 days)
infinity float64 = 31556926 * 1000
yearTimePeriodMessageID = "year"
monthTimePeriodMessageID = "month"
weekTimePeriodMessageID = "week"
dayTimePeriodMessageID = "day"
hourTimePeriodMessageID = "hour"
minuteTimePeriodMessageID = "minute"
secondTimePeriodMessageID = "second"
fromSinceMessageID = "from_now"
agoSinceMessageID = "ago"
tomorrowMessageID = "tomorrow"
justNowMessageID = "just_now"
yesterdayMessageID = "yesterday"
)
// Handler function which determines the time difference based on defined time spams
func handler(timeIntervalThreshold float64, timePeriodMessageID, sinceMessageID string, localizer *i18n.Localizer) func(float64) string {
return func(difference float64) string {
var str strings.Builder
n := difference / timeIntervalThreshold
nStr := strconv.FormatFloat(n, 'f', 0, 64)
timePeriod := localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: timePeriodMessageID,
TemplateData: map[string]interface{}{
"Value": nStr,
},
PluralCount: nStr,
})
since := localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: sinceMessageID,
TemplateData: map[string]string{
"Time": timePeriod,
},
})
str.WriteString(since)
return str.String()
}
}
// timeLapse condition struct
type timeLapse struct {
// Time stamp threshold to handle the time lap condition
Threshold float64
// Handler function which determines the time lapse based on the condition
Handler func(float64) string
}
func initTimeLapse(localizer *i18n.Localizer) []timeLapse {
return []timeLapse{
{Threshold: -31535999, Handler: handler(-31536000, yearTimePeriodMessageID, fromSinceMessageID, localizer)},
{Threshold: -2591999, Handler: handler(-2592000, monthTimePeriodMessageID, fromSinceMessageID, localizer)},
{Threshold: -604799, Handler: handler(-604800, weekTimePeriodMessageID, fromSinceMessageID, localizer)},
{Threshold: -172799, Handler: handler(-86400, dayTimePeriodMessageID, fromSinceMessageID, localizer)},
{Threshold: -86399, Handler: func(diff float64) string {
return localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: tomorrowMessageID,
})
}},
{Threshold: -3599, Handler: handler(-3600, hourTimePeriodMessageID, fromSinceMessageID, localizer)},
{Threshold: -59, Handler: handler(-60, minuteTimePeriodMessageID, fromSinceMessageID, localizer)},
{Threshold: -0.9999, Handler: handler(-1, secondTimePeriodMessageID, fromSinceMessageID, localizer)},
{Threshold: 1, Handler: func(diff float64) string {
return localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: justNowMessageID,
})
}},
{Threshold: 60, Handler: handler(1, secondTimePeriodMessageID, agoSinceMessageID, localizer)},
{Threshold: 3600, Handler: handler(60, minuteTimePeriodMessageID, agoSinceMessageID, localizer)},
{Threshold: 86400, Handler: handler(3600, hourTimePeriodMessageID, agoSinceMessageID, localizer)},
{Threshold: 172800, Handler: func(diff float64) string {
return localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: yesterdayMessageID,
})
}},
{Threshold: 604800, Handler: handler(86400, dayTimePeriodMessageID, agoSinceMessageID, localizer)},
{Threshold: 2592000, Handler: handler(604800, weekTimePeriodMessageID, agoSinceMessageID, localizer)},
{Threshold: 31536000, Handler: handler(2592000, monthTimePeriodMessageID, agoSinceMessageID, localizer)},
{Threshold: infinity, Handler: handler(31536000, yearTimePeriodMessageID, agoSinceMessageID, localizer)},
}
}
//Format returns a string describing how long it has been since
//the time argument passed int
func Format(t time.Time, lang string) (timeSince string) {
bundle := i18n.NewBundle(language.English)
bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
bundle.MustLoadMessageFile("de.toml")
localizer := i18n.NewLocalizer(bundle, lang)
timeLapses := initTimeLapse(localizer)
timestamp := t.Unix()
now := time.Now().Unix()
if timestamp > now || timestamp <= 0 {
timeSince = ""
}
timeElapsed := float64(now - timestamp)
for _, formatter := range timeLapses {
if timeElapsed < formatter.Threshold {
timeSince = formatter.Handler(timeElapsed)
break
}
}
return timeSince
}