src/pkg/time/zoneinfo_unix.go - The Go Programming Language

Golang

Source file src/pkg/time/zoneinfo_unix.go

     1	// Copyright 2009 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     4	
     5	// +build darwin freebsd linux netbsd openbsd
     6	
     7	// Parse "zoneinfo" time zone file.
     8	// This is a fairly standard file format used on OS X, Linux, BSD, Sun, and others.
     9	// See tzfile(5), http://en.wikipedia.org/wiki/Zoneinfo,
    10	// and ftp://munnari.oz.au/pub/oldtz/
    11	
    12	package time
    13	
    14	import (
    15		"errors"
    16		"runtime"
    17		"syscall"
    18	)
    19	
    20	func initTestingZone() {
    21		z, err := loadZoneFile(runtime.GOROOT()+"/lib/time/zoneinfo.zip", "America/Los_Angeles")
    22		if err != nil {
    23			panic("cannot load America/Los_Angeles for testing: " + err.Error())
    24		}
    25		z.name = "Local"
    26		localLoc = *z
    27	}
    28	
    29	// Many systems use /usr/share/zoneinfo, Solaris 2 has
    30	// /usr/share/lib/zoneinfo, IRIX 6 has /usr/lib/locale/TZ.
    31	var zoneDirs = []string{
    32		"/usr/share/zoneinfo/",
    33		"/usr/share/lib/zoneinfo/",
    34		"/usr/lib/locale/TZ/",
    35		runtime.GOROOT() + "/lib/time/zoneinfo/",
    36	}
    37	
    38	func initLocal() {
    39		// consult $TZ to find the time zone to use.
    40		// no $TZ means use the system default /etc/localtime.
    41		// $TZ="" means use UTC.
    42		// $TZ="foo" means use /usr/share/zoneinfo/foo.
    43	
    44		tz, ok := syscall.Getenv("TZ")
    45		switch {
    46		case !ok:
    47			z, err := loadZoneFile("", "/etc/localtime")
    48			if err == nil {
    49				localLoc = *z
    50				localLoc.name = "Local"
    51				return
    52			}
    53		case tz != "" && tz != "UTC":
    54			if z, err := loadLocation(tz); err == nil {
    55				localLoc = *z
    56				return
    57			}
    58		}
    59	
    60		// Fall back to UTC.
    61		localLoc.name = "UTC"
    62	}
    63	
    64	func loadLocation(name string) (*Location, error) {
    65		for _, zoneDir := range zoneDirs {
    66			if z, err := loadZoneFile(zoneDir, name); err == nil {
    67				z.name = name
    68				return z, nil
    69			}
    70		}
    71		return nil, errors.New("unknown time zone " + name)
    72	}