]> Cypherpunks repositories - gostls13.git/commitdiff
time: return correct zone info on js/wasm
authorAgniva De Sarker <agnivade@yahoo.co.in>
Thu, 18 Oct 2018 08:45:17 +0000 (14:15 +0530)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 24 Oct 2018 15:42:36 +0000 (15:42 +0000)
Fixes #28265

Change-Id: I0a13e9f9c216647e42127a59a80b0f19618169c1
Reviewed-on: https://go-review.googlesource.com/c/143577
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Richard Musiol <neelance@gmail.com>
src/go/build/deps_test.go
src/time/zoneinfo_js.go [new file with mode: 0644]
src/time/zoneinfo_unix.go

index 386ab9e408a184ad4d1c83564f2ea1e2a83a3138..5e5b5ed655e20a19abe0b98f5d40e00b2f660f16 100644 (file)
@@ -159,6 +159,7 @@ var pkgDeps = map[string][]string{
                // Other time dependencies:
                "internal/syscall/windows/registry",
                "syscall",
+               "syscall/js",
        },
 
        "internal/poll":    {"L0", "internal/race", "syscall", "time", "unicode/utf16", "unicode/utf8", "internal/syscall/windows"},
diff --git a/src/time/zoneinfo_js.go b/src/time/zoneinfo_js.go
new file mode 100644 (file)
index 0000000..d640c83
--- /dev/null
@@ -0,0 +1,66 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build js,wasm
+
+package time
+
+import (
+       "runtime"
+       "syscall/js"
+)
+
+var zoneSources = []string{
+       "/usr/share/zoneinfo/",
+       "/usr/share/lib/zoneinfo/",
+       "/usr/lib/locale/TZ/",
+       runtime.GOROOT() + "/lib/time/zoneinfo.zip",
+}
+
+func initLocal() {
+       localLoc.name = "Local"
+
+       z := zone{}
+       d := js.Global().Get("Date").New()
+       offset := d.Call("getTimezoneOffset").Int() * -1
+       z.offset = offset * 60
+       // According to https://tc39.github.io/ecma262/#sec-timezoneestring,
+       // the timezone name from (new Date()).toTimeString() is an implementation-dependent
+       // result, and in Google Chrome, it gives the fully expanded name rather than
+       // the abbreviation.
+       // Hence, we construct the name from the offset.
+       z.name = "UTC"
+       if offset < 0 {
+               z.name += "-"
+       } else {
+               z.name += "+"
+       }
+       z.name += itoa(offset / 60)
+       min := offset % 60
+       if min != 0 {
+               z.name += ":" + itoa(min)
+       }
+       localLoc.zone = []zone{z}
+}
+
+// itoa is just the fast path implementation copied from strconv.Itoa.
+// No timezone hour can exceed 100, so the fast path will always satisfy.
+func itoa(i int) string {
+       if i < 10 {
+               return digits[i : i+1]
+       }
+       return smallsString[i*2 : i*2+2]
+}
+
+const smallsString = "00010203040506070809" +
+       "10111213141516171819" +
+       "20212223242526272829" +
+       "30313233343536373839" +
+       "40414243444546474849" +
+       "50515253545556575859" +
+       "60616263646566676869" +
+       "70717273747576777879" +
+       "80818283848586878889" +
+       "90919293949596979899"
+const digits = "0123456789"
index fca8e5497b92815cafa0042b0c8ffdc8254878ef..d6bcabfb8083bd066a25259fef5d763c1dbcec30 100644 (file)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build aix darwin,386 darwin,amd64 dragonfly freebsd js,wasm linux,!android nacl netbsd openbsd solaris
+// +build aix darwin,386 darwin,amd64 dragonfly freebsd linux,!android nacl netbsd openbsd solaris
 
 // Parse "zoneinfo" time zone file.
 // This is a fairly standard file format used on OS X, Linux, BSD, Sun, and others.