-
Notifications
You must be signed in to change notification settings - Fork 34
/
Copy pathrfc822.go
132 lines (117 loc) · 3.39 KB
/
rfc822.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
125
126
127
128
129
130
131
132
package clock
import (
"strconv"
"time"
)
var datetimeLayouts = [48]string{
// Day first month 2nd abbreviated.
"Mon, 2 Jan 2006 15:04:05 MST",
"Mon, 2 Jan 2006 15:04:05 -0700",
"Mon, 2 Jan 2006 15:04:05 -0700 (MST)",
"2 Jan 2006 15:04:05 MST",
"2 Jan 2006 15:04:05 -0700",
"2 Jan 2006 15:04:05 -0700 (MST)",
"Mon, 2 Jan 2006 15:04 MST",
"Mon, 2 Jan 2006 15:04 -0700",
"Mon, 2 Jan 2006 15:04 -0700 (MST)",
"2 Jan 2006 15:04 MST",
"2 Jan 2006 15:04 -0700",
"2 Jan 2006 15:04 -0700 (MST)",
// Month first day 2nd abbreviated.
"Mon, Jan 2 2006 15:04:05 MST",
"Mon, Jan 2 2006 15:04:05 -0700",
"Mon, Jan 2 2006 15:04:05 -0700 (MST)",
"Jan 2 2006 15:04:05 MST",
"Jan 2 2006 15:04:05 -0700",
"Jan 2 2006 15:04:05 -0700 (MST)",
"Mon, Jan 2 2006 15:04 MST",
"Mon, Jan 2 2006 15:04 -0700",
"Mon, Jan 2 2006 15:04 -0700 (MST)",
"Jan 2 2006 15:04 MST",
"Jan 2 2006 15:04 -0700",
"Jan 2 2006 15:04 -0700 (MST)",
// Day first month 2nd not abbreviated.
"Mon, 2 January 2006 15:04:05 MST",
"Mon, 2 January 2006 15:04:05 -0700",
"Mon, 2 January 2006 15:04:05 -0700 (MST)",
"2 January 2006 15:04:05 MST",
"2 January 2006 15:04:05 -0700",
"2 January 2006 15:04:05 -0700 (MST)",
"Mon, 2 January 2006 15:04 MST",
"Mon, 2 January 2006 15:04 -0700",
"Mon, 2 January 2006 15:04 -0700 (MST)",
"2 January 2006 15:04 MST",
"2 January 2006 15:04 -0700",
"2 January 2006 15:04 -0700 (MST)",
// Month first day 2nd not abbreviated.
"Mon, January 2 2006 15:04:05 MST",
"Mon, January 2 2006 15:04:05 -0700",
"Mon, January 2 2006 15:04:05 -0700 (MST)",
"January 2 2006 15:04:05 MST",
"January 2 2006 15:04:05 -0700",
"January 2 2006 15:04:05 -0700 (MST)",
"Mon, January 2 2006 15:04 MST",
"Mon, January 2 2006 15:04 -0700",
"Mon, January 2 2006 15:04 -0700 (MST)",
"January 2 2006 15:04 MST",
"January 2 2006 15:04 -0700",
"January 2 2006 15:04 -0700 (MST)",
}
// Allows seamless JSON encoding/decoding of rfc822 formatted timestamps.
// https://www.ietf.org/rfc/rfc822.txt section 5.
type RFC822Time struct {
Time
}
// NewRFC822Time creates RFC822Time from a standard Time. The created value is
// truncated down to second precision because RFC822 does not allow for better.
func NewRFC822Time(t Time) RFC822Time {
return RFC822Time{Time: t.Truncate(Second)}
}
// ParseRFC822Time parses an RFC822 time string.
func ParseRFC822Time(s string) (Time, error) {
var t time.Time
var err error
for _, layout := range &datetimeLayouts {
t, err = Parse(layout, s)
if err == nil {
return t, nil
}
}
return t, err
}
// NewRFC822Time creates RFC822Time from a Unix timestamp (seconds from Epoch).
func NewRFC822TimeFromUnix(timestamp int64) RFC822Time {
return RFC822Time{Time: Unix(timestamp, 0).UTC()}
}
func (t RFC822Time) MarshalJSON() ([]byte, error) {
return []byte(strconv.Quote(t.Format(RFC1123))), nil
}
func (t RFC822Time) MarshalText() ([]byte, error) {
return []byte(t.String()), nil
}
func (t *RFC822Time) UnmarshalText(s []byte) error {
parsed, err := ParseRFC822Time(string(s))
if err != nil {
return err
}
t.Time = parsed
return nil
}
func (t *RFC822Time) UnmarshalJSON(s []byte) error {
q, err := strconv.Unquote(string(s))
if err != nil {
return err
}
parsed, err := ParseRFC822Time(q)
if err != nil {
return err
}
t.Time = parsed
return nil
}
func (t RFC822Time) String() string {
return t.Format(RFC1123)
}
func (t RFC822Time) StringWithOffset() string {
return t.Format(RFC1123Z)
}