@@ -7,19 +7,54 @@ import (
7
7
"fmt"
8
8
"html"
9
9
"html/template"
10
+ "time"
10
11
)
11
12
12
- // DateTime renders an absolute time HTML given a time as a string
13
- func DateTime (format , datetime , fallback string ) template.HTML {
14
- datetimeEscaped := html .EscapeString (datetime )
15
- fallbackEscaped := html .EscapeString (fallback )
13
+ // DateTime renders an absolute time HTML element by datetime.
14
+ func DateTime (format string , datetime any ) template.HTML {
15
+ if p , ok := datetime .(* time.Time ); ok {
16
+ datetime = * p
17
+ }
18
+ if p , ok := datetime .(* TimeStamp ); ok {
19
+ datetime = * p
20
+ }
21
+ switch v := datetime .(type ) {
22
+ case TimeStamp :
23
+ datetime = v .AsTime ()
24
+ case int :
25
+ datetime = TimeStamp (v ).AsTime ()
26
+ case int64 :
27
+ datetime = TimeStamp (v ).AsTime ()
28
+ }
29
+
30
+ var datetimeEscaped , textEscaped string
31
+ switch v := datetime .(type ) {
32
+ case nil :
33
+ return "N/A"
34
+ case string :
35
+ datetimeEscaped = html .EscapeString (v )
36
+ textEscaped = datetimeEscaped
37
+ case time.Time :
38
+ if v .IsZero () || v .Unix () == 0 {
39
+ return "N/A"
40
+ }
41
+ datetimeEscaped = html .EscapeString (v .Format (time .RFC3339 ))
42
+ if format == "full" {
43
+ textEscaped = html .EscapeString (v .Format ("2006-01-02 15:04:05 -07:00" ))
44
+ } else {
45
+ textEscaped = html .EscapeString (v .Format ("2006-01-02" ))
46
+ }
47
+ default :
48
+ panic (fmt .Sprintf ("Unsupported time type %T" , datetime ))
49
+ }
50
+
16
51
switch format {
17
52
case "short" :
18
- return template .HTML (fmt .Sprintf (`<relative-time format="datetime" year="numeric" month="short" day="numeric" weekday="" datetime="%s">%s</relative-time>` , datetimeEscaped , fallbackEscaped ))
53
+ return template .HTML (fmt .Sprintf (`<relative-time format="datetime" year="numeric" month="short" day="numeric" weekday="" datetime="%s">%s</relative-time>` , datetimeEscaped , textEscaped ))
19
54
case "long" :
20
- return template .HTML (fmt .Sprintf (`<relative-time format="datetime" year="numeric" month="long" day="numeric" weekday="" datetime="%s">%s</relative-time>` , datetimeEscaped , fallbackEscaped ))
55
+ return template .HTML (fmt .Sprintf (`<relative-time format="datetime" year="numeric" month="long" day="numeric" weekday="" datetime="%s">%s</relative-time>` , datetimeEscaped , textEscaped ))
21
56
case "full" :
22
- return template .HTML (fmt .Sprintf (`<relative-time format="datetime" weekday="" year="numeric" month="short" day="numeric" hour="numeric" minute="numeric" second="numeric" datetime="%s">%s</relative-time>` , datetimeEscaped , fallbackEscaped ))
57
+ return template .HTML (fmt .Sprintf (`<relative-time format="datetime" weekday="" year="numeric" month="short" day="numeric" hour="numeric" minute="numeric" second="numeric" datetime="%s">%s</relative-time>` , datetimeEscaped , textEscaped ))
23
58
}
24
- return template . HTML ( "error in DateTime" )
59
+ panic ( fmt . Sprintf ( "Unsupported format %s" , format ) )
25
60
}
0 commit comments