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
|
package format
import (
"lain/types"
"time"
)
func FormatEmailDate(date time.Time, dateFormat types.DateFormat, timeFormat types.TimeFormat, prettyDates bool, timezone string) string {
loc, err := time.LoadLocation(timezone)
if err != nil {
loc = time.UTC
}
date = date.In(loc)
now := time.Now().In(loc)
if prettyDates {
return formatPrettyDate(date, now, timeFormat)
}
return formatFullDate(date, dateFormat, timeFormat)
}
func formatPrettyDate(date, now time.Time, timeFormat types.TimeFormat) string {
diff := now.Sub(date)
// Today - show time only
if date.Year() == now.Year() && date.YearDay() == now.YearDay() {
return formatTime(date, timeFormat)
}
// Yesterday
yesterday := now.AddDate(0, 0, -1)
if date.Year() == yesterday.Year() && date.YearDay() == yesterday.YearDay() {
return "Yesterday"
}
// This week - show day name and time
if diff.Hours() < 168 { // 7 days
dayName := date.Format("Mon")
timeStr := formatTime(date, timeFormat)
return dayName + " " + timeStr
}
// This year - show month and day
if date.Year() == now.Year() {
return date.Format("Jan 2")
}
// Older - show full date
return date.Format("Jan 2, 2006")
}
func formatFullDate(date time.Time, dateFormat types.DateFormat, timeFormat types.TimeFormat) string {
dateStr := formatDate(date, dateFormat)
timeStr := formatTime(date, timeFormat)
return dateStr + " " + timeStr
}
func formatDate(date time.Time, dateFormat types.DateFormat) string {
switch dateFormat {
case types.YearMonthDayDashed:
return date.Format("2006-01-02")
case types.YearMonthDaySlashed:
return date.Format("2006/01/02")
case types.YearMonthDayDotted:
return date.Format("2006.01.02")
case types.DayMonthYearDashed:
return date.Format("02-01-2006")
case types.DayMonthYearSlashed:
return date.Format("02/01/2006")
case types.DayMonthYearDotted:
return date.Format("02.01.2006")
case types.DayMonthYearDottedShort:
return date.Format("2.1.06")
default:
return date.Format("2006-01-02")
}
}
func formatTime(date time.Time, timeFormat types.TimeFormat) string {
switch timeFormat {
case types.ShortHoursAndMinutes24Hours:
return date.Format("15:4")
case types.FullHoursAndMinutes24Hours:
return date.Format("15:04")
case types.ShortHoursAndMinutes12Hours:
return date.Format("3:4 PM")
case types.FullHoursAndMinutes12Hours:
return date.Format("03:04 PM")
default:
return date.Format("15:04")
}
}
|