Source file src/pkg/time/genzabbrs.go
1
2
3
4
5
6
7
8
9
10
11
12
13 package main
14
15 import (
16 "bytes"
17 "encoding/xml"
18 "flag"
19 "go/format"
20 "io/ioutil"
21 "log"
22 "net/http"
23 "sort"
24 "text/template"
25 "time"
26 )
27
28 var filename = flag.String("output", "zoneinfo_abbrs_windows.go", "output file name")
29
30
31
32 func getAbbrs(l *time.Location) (st, dt string) {
33 t := time.Date(time.Now().Year(), 0, 1, 0, 0, 0, 0, l)
34 abbr1, off1 := t.Zone()
35 for i := 0; i < 12; i++ {
36 t = t.AddDate(0, 1, 0)
37 abbr2, off2 := t.Zone()
38 if abbr1 != abbr2 {
39 if off2-off1 < 0 {
40 abbr1, abbr2 = abbr2, abbr1
41 }
42 return abbr1, abbr2
43 }
44 }
45 return abbr1, abbr1
46 }
47
48 type zone struct {
49 WinName string
50 UnixName string
51 StTime string
52 DSTime string
53 }
54
55 const wzURL = "http://unicode.org/cldr/data/common/supplemental/windowsZones.xml"
56
57 type MapZone struct {
58 Other string `xml:"other,attr"`
59 Territory string `xml:"territory,attr"`
60 Type string `xml:"type,attr"`
61 }
62
63 type SupplementalData struct {
64 Zones []MapZone `xml:"windowsZones>mapTimezones>mapZone"`
65 }
66
67 func readWindowsZones() ([]*zone, error) {
68 r, err := http.Get(wzURL)
69 if err != nil {
70 return nil, err
71 }
72 defer r.Body.Close()
73
74 data, err := ioutil.ReadAll(r.Body)
75 if err != nil {
76 return nil, err
77 }
78
79 var sd SupplementalData
80 err = xml.Unmarshal(data, &sd)
81 if err != nil {
82 return nil, err
83 }
84 zs := make([]*zone, 0)
85 for _, z := range sd.Zones {
86 if z.Territory != "001" {
87
88 continue
89 }
90 l, err := time.LoadLocation(z.Type)
91 if err != nil {
92 return nil, err
93 }
94 st, dt := getAbbrs(l)
95 zs = append(zs, &zone{
96 WinName: z.Other,
97 UnixName: z.Type,
98 StTime: st,
99 DSTime: dt,
100 })
101 }
102 return zs, nil
103 }
104
105 func main() {
106 flag.Parse()
107 zs, err := readWindowsZones()
108 if err != nil {
109 log.Fatal(err)
110 }
111 sort.Slice(zs, func(i, j int) bool {
112 return zs[i].UnixName < zs[j].UnixName
113 })
114 var v = struct {
115 URL string
116 Zs []*zone
117 }{
118 wzURL,
119 zs,
120 }
121 var buf bytes.Buffer
122 err = template.Must(template.New("prog").Parse(prog)).Execute(&buf, v)
123 if err != nil {
124 log.Fatal(err)
125 }
126 data, err := format.Source(buf.Bytes())
127 if err != nil {
128 log.Fatal(err)
129 }
130 err = ioutil.WriteFile(*filename, data, 0644)
131 if err != nil {
132 log.Fatal(err)
133 }
134 }
135
136 const prog = `
137 // Copyright 2013 The Go Authors. All rights reserved.
138 // Use of this source code is governed by a BSD-style
139 // license that can be found in the LICENSE file.
140
141 // Code generated by genzabbrs.go; DO NOT EDIT.
142 // Based on information from {{.URL}}
143
144 package time
145
146 type abbr struct {
147 std string
148 dst string
149 }
150
151 var abbrs = map[string]abbr{
152 {{range .Zs}} "{{.WinName}}": {"{{.StTime}}", "{{.DSTime}}"}, // {{.UnixName}}
153 {{end}}}
154
155 `
156
View as plain text