...
1
5
6 package tzdata
7
8 import (
9 "bytes"
10 "fmt"
11 "io"
12 "sort"
13 "strings"
14 "time"
15 )
16
17 func UpdateWindowsTZMapping(target io.Writer) error {
18
19 backward, err := DownloadOldNames()
20 if err != nil {
21 return err
22 }
23
24 data, err := DownloadWindowsZones()
25 if err != nil {
26 return err
27 }
28
29 win_tz := make(map[string]string)
30 tz_win := make(map[string]string)
31
32
33 tz_win["Etc/UTC"] = "UTC"
34
35 for _, element := range data.WindowsZones.MapTimezones {
36
37
38
39
40
41 for _, m := range element.MapZone {
42 t := strings.Split(m.Type, " ")
43 if m.Territory == "001" {
44 win_tz[m.Other] = t[0]
45 }
46 for _, tz_name := range t {
47 tz_win[tz_name] = m.Other
48 }
49 }
50
51
52 for backward_compat_name, standard_name := range backward {
53 if win_zone, ok := tz_win[standard_name]; ok {
54 tz_win[backward_compat_name] = win_zone
55 }
56 }
57 }
58
59
60 win_tz_keys := make([]string, 0, len(win_tz))
61 for k := range win_tz {
62 win_tz_keys = append(win_tz_keys, k)
63 }
64 sort.Strings(win_tz_keys)
65
66 tz_win_keys := make([]string, 0, len(tz_win))
67 for k := range tz_win {
68 tz_win_keys = append(tz_win_keys, k)
69 }
70 sort.Strings(tz_win_keys)
71
72
73 out := bytes.Buffer{}
74 out.WriteString("// A lookup table, mapping Windows time zone names to IANA time zone names and vice versa.\n\n")
75 out.WriteString(fmt.Sprintf("// Last created %v\n\n", time.Now().UTC().Format(time.RFC3339)))
76 out.WriteString("// WinTZtoIANA maps time zone names used by Windows to those used by IANA\n")
77 out.WriteString("var WinTZtoIANA = map[string]string{\n")
78
79 for _, k := range win_tz_keys {
80 out.WriteString(fmt.Sprintf("\t\"%v\": \"%v\",\n", k, win_tz[k]))
81 }
82 out.WriteString("}\n\n")
83 out.WriteString("// IANAtoWinTZ maps time zone names used by IANA to those used by Windows\n")
84 out.WriteString("var IANAtoWinTZ = map[string]string{\n")
85
86 for _, k := range tz_win_keys {
87 out.WriteString(fmt.Sprintf(" \"%v\":\"%v\",\n", k, tz_win[k]))
88 }
89 out.WriteString("}\n")
90
91
92 target.Write(out.Bytes())
93
94 return nil
95 }
96
View as plain text