Commit d2a835fb authored by Ben Olive's avatar Ben Olive Committed by Russ Cox

time: add ISO 8601 time format

Fixes #431.

R=r, rsc
CC=golang-dev
https://golang.org/cl/179079
parent 95c776cc
......@@ -319,6 +319,9 @@ func format(t *Time, fmt string) string {
case 'M': // %M minute 00-59
decimal(buf[bp:bp+2], t.Minute)
bp += 2
case 'm': // %m month 01-12
decimal(buf[bp:bp+2], t.Month)
bp += 2
case 'S': // %S second 00-59
decimal(buf[bp:bp+2], t.Second)
bp += 2
......@@ -328,6 +331,20 @@ func format(t *Time, fmt string) string {
case 'y': // %y year 08
decimal(buf[bp:bp+2], int(t.Year%100))
bp += 2
case 'z': // %z tz in the form -0500
if t.ZoneOffset == 0 {
bp = addString(buf, bp, "Z")
} else if t.ZoneOffset < 0 {
bp = addString(buf, bp, "-")
decimal(buf[bp:bp+2], -t.ZoneOffset/3600)
decimal(buf[bp+2:bp+4], (-t.ZoneOffset%3600)/60)
bp += 4
} else {
bp = addString(buf, bp, "+")
decimal(buf[bp:bp+2], t.ZoneOffset/3600)
decimal(buf[bp+2:bp+4], (t.ZoneOffset%3600)/60)
bp += 4
}
case 'Z':
bp = addString(buf, bp, t.Zone)
default:
......@@ -355,6 +372,10 @@ func (t *Time) RFC850() string { return format(t, "%A, %d-%b-%y %H:%M:%S %Z") }
// RFC 1123: Sun, 06 Nov 1994 08:49:37 UTC
func (t *Time) RFC1123() string { return format(t, "%a, %d %b %Y %H:%M:%S %Z") }
// ISO8601 formats the parsed time value in the style of
// ISO 8601: 1994-11-06T08:49:37Z
func (t *Time) ISO8601() string { return format(t, "%Y-%m-%dT%H:%M:%S%z") }
// String formats the parsed time value in the style of
// date(1) - Sun Nov 6 08:49:37 UTC 1994
// date(1): Sun Nov 6 08:49:37 UTC 1994
func (t *Time) String() string { return format(t, "%a %b %e %H:%M:%S %Z %Y") }
......@@ -101,6 +101,27 @@ func TestSecondsToUTCAndBack(t *testing.T) {
}
}
type TimeFormatTest struct {
time Time
formattedValue string
}
var iso8601Formats = []TimeFormatTest{
TimeFormatTest{Time{2008, 9, 17, 20, 4, 26, Wednesday, 0, "UTC"}, "2008-09-17T20:04:26Z"},
TimeFormatTest{Time{1994, 9, 17, 20, 4, 26, Wednesday, -18000, "EST"}, "1994-09-17T20:04:26-0500"},
TimeFormatTest{Time{2000, 12, 26, 1, 15, 6, Wednesday, 15600, "OTO"}, "2000-12-26T01:15:06+0420"},
}
func TestISO8601Conversion(t *testing.T) {
for _, f := range iso8601Formats {
if f.time.ISO8601() != f.formattedValue {
t.Error("ISO8601():")
t.Errorf(" want=%+v", f.formattedValue)
t.Errorf(" have=%+v", f.time.ISO8601())
}
}
}
func BenchmarkSeconds(b *testing.B) {
for i := 0; i < b.N; i++ {
Seconds()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment