]> Cypherpunks repositories - gostls13.git/commitdiff
time: allow +00 as numeric timezone name and GMT offset
authorAlberto Donizetti <alb.donizetti@gmail.com>
Wed, 22 Aug 2018 08:58:24 +0000 (10:58 +0200)
committerAlberto Donizetti <alb.donizetti@gmail.com>
Fri, 24 Aug 2018 17:31:42 +0000 (17:31 +0000)
A timezone with a zero offset from UTC and without a three-letter
abbreviation will have a numeric name in timestamps: "+00".

There are currently two of them:

  $ zdump Atlantic/Azores America/Scoresbysund
  Atlantic/Azores       Wed Aug 22 09:01:05 2018 +00
  America/Scoresbysund  Wed Aug 22 09:01:05 2018 +00

These two timestamp are rejected by Parse, since it doesn't allow for
zero offsets:

  parsing time "Wed Aug 22 09:01:05 2018 +00": extra text: +00

This change modifies Parse to accept a +00 offset in numeric timezone
names.

As side effect of this change, Parse also now accepts "GMT+00". It was
explicitely disallowed (with a unit test ensuring it got rejected),
but the restriction seems incorrect.

DATE(1), for example, allows it:

  $ date --debug --date="2009-01-02 03:04:05 GMT+00"

  date: parsed date part: (Y-M-D) 2009-01-02
  date: parsed time part: 03:04:05
  date: parsed zone part: UTC+00
  date: input timezone: parsed date/time string (+00)
  date: using specified time as starting value: '03:04:05'
  date: starting date/time: '(Y-M-D) 2009-01-02 03:04:05 TZ=+00'
  date: '(Y-M-D) 2009-01-02 03:04:05 TZ=+00' = 1230865445 epoch-seconds
  date: timezone: system default
  date: final: 1230865445.000000000 (epoch-seconds)
  date: final: (Y-M-D) 2009-01-02 03:04:05 (UTC)
  date: final: (Y-M-D) 2009-01-02 04:04:05 (UTC+01)
  Fri  2 Jan 04:04:05 CET 2009

This fixes 2 of 17 time.Parse() failures listed in Issue #26032.

Updates #26032

Change-Id: I01cd067044371322b7bb1dae452fb3c758ed3cc2
Reviewed-on: https://go-review.googlesource.com/130696
Run-TryBot: Alberto Donizetti <alb.donizetti@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/time/format.go
src/time/format_test.go

index f9cdbab3b8f31cc9f710d4634cdf63e0ade6b97e..2adbbe07706d8edad93285e4c5b1ed4ef022ae67 100644 (file)
@@ -1172,13 +1172,15 @@ func parseSignedOffset(value string) int {
                return 0
        }
        x, rem, err := leadingInt(value[1:])
-       if err != nil {
+
+       // fail if nothing consumed by leadingInt
+       if err != nil || value[1:] == rem {
                return 0
        }
        if sign == '-' {
                x = -x
        }
-       if x == 0 || x < -23 || 23 < x {
+       if x < -23 || 23 < x {
                return 0
        }
        return len(value) - len(rem)
index c3552f4161361f5565d999d7fed53c88fcbbcf8b..db9d4f495ac93ddd63d09f74f64c667f67cbb02c 100644 (file)
@@ -416,7 +416,11 @@ var parseTimeZoneTests = []ParseTimeZoneTest{
        {"gmt hi there", 0, false},
        {"GMT hi there", 3, true},
        {"GMT+12 hi there", 6, true},
-       {"GMT+00 hi there", 3, true}, // 0 or 00 is not a legal offset.
+       {"GMT+00 hi there", 6, true},
+       {"GMT+", 3, true},
+       {"GMT+3", 5, true},
+       {"GMT+a", 3, true},
+       {"GMT+3a", 5, true},
        {"GMT-5 hi there", 5, true},
        {"GMT-51 hi there", 3, true},
        {"ChST hi there", 4, true},
@@ -431,6 +435,7 @@ var parseTimeZoneTests = []ParseTimeZoneTest{
        {"+03 hi", 3, true},
        {"-04 hi", 3, true},
        // Issue #26032
+       {"+00", 3, true},
        {"-11", 3, true},
        {"-12", 3, true},
        {"-23", 3, true},