...

Source file src/github.com/thlib/go-timezone-local/tzlocal/tz_unix.go

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

     1  //go:build !windows
     2  // +build !windows
     3  
     4  package tzlocal
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"path"
    10  )
    11  
    12  const localZoneFile = "/etc/localtime" // symlinked file - set by OS
    13  
    14  func inferFromPath(p string) (string, error) {
    15  	var name string
    16  	var err error
    17  	dir, lname := path.Split(p)
    18  
    19  	if len(dir) == 0 || len(lname) == 0 {
    20  		err = fmt.Errorf("cannot infer timezone name from path: %q", p)
    21  		return name, err
    22  	}
    23  
    24  	_, fname := path.Split(dir[:len(dir)-1])
    25  
    26  	if fname == "zoneinfo" {
    27  		name = lname // e.g. /usr/share/zoneinfo/Japan
    28  	} else {
    29  		name = fname + string(os.PathSeparator) + lname // e.g. /usr/share/zoneinfo/Asia/Tokyo
    30  	}
    31  
    32  	return name, err
    33  }
    34  
    35  // LocalTZ will run `/etc/localtime` and get the timezone from the resulting value `/usr/share/zoneinfo/America/New_York`
    36  func LocalTZ() (string, error) {
    37  	var name string
    38  	fi, err := os.Lstat(localZoneFile)
    39  	if err != nil {
    40  		err = fmt.Errorf("failed to stat %q: %w", localZoneFile, err)
    41  		return name, err
    42  	}
    43  
    44  	if (fi.Mode() & os.ModeSymlink) == 0 {
    45  		err = fmt.Errorf("%q is not a symlink - cannot infer name", localZoneFile)
    46  		return name, err
    47  	}
    48  
    49  	p, err := os.Readlink(localZoneFile)
    50  	if err != nil {
    51  		return name, err
    52  	}
    53  
    54  	// handles 1 & 2 part zone names
    55  	name, err = inferFromPath(p)
    56  	return name, err
    57  }
    58  

View as plain text