|
8 | 8 |
|
9 | 9 | // const pgTimestamptzHourFormat = "2006-01-02 15:04:05.999999999Z07" |
10 | 10 | // const pgTimestamptzMinuteFormat = "2006-01-02 15:04:05.999999999Z07:00" |
11 | | -const pgTimestamptzSecondFormat = "2006-01-02 15:04:05.999999999Z07:00:00" |
| 11 | +// const pgTimestamptzSecondFormat = "2006-01-02 15:04:05.999999999Z07:00:00" |
12 | 12 |
|
13 | 13 | // this is the default format used by time.Time.String() |
14 | 14 | const defaultStringFormat = "2006-01-02 15:04:05.999999999 -0700 MST" |
@@ -40,7 +40,7 @@ func (dst *Timestamptz) Equal(src CQType) bool { |
40 | 40 |
|
41 | 41 | func (dst *Timestamptz) String() string { |
42 | 42 | if dst.Status == Present { |
43 | | - return dst.Time.Format(pgTimestamptzSecondFormat) |
| 43 | + return dst.Time.Format(time.RFC3339) |
44 | 44 | } else { |
45 | 45 | return "" |
46 | 46 | } |
@@ -119,25 +119,20 @@ func (dst *Timestamptz) DecodeText(src []byte) error { |
119 | 119 | case "-infinity": |
120 | 120 | *dst = Timestamptz{Status: Present, InfinityModifier: -Infinity} |
121 | 121 | default: |
122 | | - var format string |
123 | | - sbufLen := len(sbuf) |
124 | | - if sbufLen >= 19 && sbuf[10] == 'T' && sbuf[19] == 'Z' { |
125 | | - format = time.RFC3339 |
126 | | - } else if sbufLen >= 19 && sbuf[10] == 'T' && sbuf[19] == '.' { |
127 | | - format = time.RFC3339Nano |
128 | | - } else { |
129 | | - if sbufLen >= len(defaultStringFormat) { |
130 | | - sbuf = sbuf[:len(defaultStringFormat)] |
131 | | - } |
132 | | - format = defaultStringFormat |
| 122 | + var tim time.Time |
| 123 | + var err error |
| 124 | + // there is no good way of detecting format so we just try few of them |
| 125 | + tim, err = time.Parse(time.RFC3339, sbuf) |
| 126 | + if err == nil { |
| 127 | + *dst = Timestamptz{Time: normalizePotentialUTC(tim), Status: Present} |
| 128 | + return nil |
133 | 129 | } |
134 | | - |
135 | | - tim, err := time.Parse(format, sbuf) |
136 | | - if err != nil { |
137 | | - return err |
| 130 | + tim, err = time.Parse(defaultStringFormat, sbuf) |
| 131 | + if err == nil { |
| 132 | + *dst = Timestamptz{Time: normalizePotentialUTC(tim), Status: Present} |
138 | 133 | } |
| 134 | + return fmt.Errorf("cannot parse %s as Timestamptz", sbuf) |
139 | 135 |
|
140 | | - *dst = Timestamptz{Time: normalizePotentialUTC(tim), Status: Present} |
141 | 136 | } |
142 | 137 |
|
143 | 138 | return nil |
|
0 commit comments