...
1
2
3
4 package tzlocal
5
6 import (
7 "fmt"
8 "os"
9 "path"
10 )
11
12 const localZoneFile = "/etc/localtime"
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
28 } else {
29 name = fname + string(os.PathSeparator) + lname
30 }
31
32 return name, err
33 }
34
35
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
55 name, err = inferFromPath(p)
56 return name, err
57 }
58
View as plain text