...

Source file src/github.com/thlib/go-timezone-local/tzdata/tz_mapping.go

Documentation: github.com/thlib/go-timezone-local/tzdata

     1  /*
     2   * Based on a python package to update windows mappings
     3   * @see https://github.com/regebro/tzlocal/blob/master/update_windows_mappings.py
     4   */
     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  	// # UTC is a common but non-standard alias for Etc/UTC:
    33  	tz_win["Etc/UTC"] = "UTC"
    34  
    35  	for _, element := range data.WindowsZones.MapTimezones {
    36  		// if element.Type == "windows" {
    37  		// 	break
    38  		// }
    39  
    40  		// Making windows mapping
    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  		// Map in the backwards compatible zone names
    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  	// sort the keys
    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  	// Generate the code
    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  	// Write buffered code to target writer
    92  	target.Write(out.Bytes())
    93  
    94  	return nil
    95  }
    96  

View as plain text