diff --git a/time.go b/time.go index dd334163..00ce754c 100644 --- a/time.go +++ b/time.go @@ -15,7 +15,7 @@ func (m RelaxedTime) MarshalText() ([]byte, error) { } func (m RelaxedTime) String() string { - return time.Time(m).UTC().Format(timeFormat) + return time.Time(m).Round(time.Millisecond).UTC().Format(timeFormat) } func (m *RelaxedTime) UnmarshalText(text []byte) error { @@ -25,18 +25,21 @@ func (m *RelaxedTime) UnmarshalText(text []byte) error { } t, err1 := time.Parse(time.RFC3339, string(text)) if err1 == nil { + t = t.Round(time.Millisecond) *m = RelaxedTime(t) return nil } t, err2 := time.Parse(time.RFC3339Nano, string(text)) if err2 == nil { + t = t.Round(time.Millisecond) *m = RelaxedTime(t) return nil } t, err2 = time.Parse("2006-01-02T15:04:05.999999999", string(text)) if err2 == nil { + t = t.Round(time.Millisecond) *m = RelaxedTime(t) return nil } diff --git a/time_test.go b/time_test.go new file mode 100644 index 00000000..c8f3277d --- /dev/null +++ b/time_test.go @@ -0,0 +1,57 @@ +package saml + +import ( + "time" + + . "gopkg.in/check.v1" +) + +var _ = Suite(&TimeTest{}) + +type TimeTest struct { +} + +func (test *TimeTest) TestFormat(c *C) { + t := time.Date(1981, 02, 03, 14, 15, 16, 17, time.UTC) + c.Assert(RelaxedTime(t).String(), Equals, "1981-02-03T14:15:16Z") + + buf, err := RelaxedTime(t).MarshalText() + c.Assert(err, IsNil) + c.Assert(string(buf), Equals, "1981-02-03T14:15:16Z") + + loc, err := time.LoadLocation("America/New_York") + c.Assert(err, IsNil) + t = time.Date(1981, 02, 03, 9, 15, 16, 17, loc) + + c.Assert(RelaxedTime(t).String(), Equals, "1981-02-03T14:15:16Z") + buf, err = RelaxedTime(t).MarshalText() + c.Assert(err, IsNil) + c.Assert(string(buf), Equals, "1981-02-03T14:15:16Z") +} + +func (test *TimeTest) TestParse(c *C) { + { + var t RelaxedTime + err := t.UnmarshalText([]byte("1981-02-03T14:15:16Z")) + c.Assert(err, IsNil) + c.Assert(t, DeepEquals, RelaxedTime(time.Date(1981, 02, 03, 14, 15, 16, 0, time.UTC))) + } + + { + var t RelaxedTime + err := t.UnmarshalText([]byte("1981-02-03T14:15:16.178901234Z")) + c.Assert(err, IsNil) + c.Assert(t, DeepEquals, RelaxedTime(time.Date(1981, 02, 03, 14, 15, 16, 179000000, time.UTC))) + } + { + var t RelaxedTime + err := t.UnmarshalText([]byte("1981-02-03T14:15:16.1717Z")) + c.Assert(err, IsNil) + c.Assert(t, DeepEquals, RelaxedTime(time.Date(1981, 02, 03, 14, 15, 16, 172000000, time.UTC))) + } + { + var t RelaxedTime + err := t.UnmarshalText([]byte("1981-02-03T14:15:16Z04:00")) + c.Assert(err, ErrorMatches, "parsing time \"1981-02-03T14:15:16Z04:00\": extra text: 04:00") + } +}