Go: Time zones

Each Time has an associated Location, which is used for display purposes.

The method In returns a time with a specific location. Changing the location in this way changes only the presentation; it does not change the instant in time.

Here is a convenience function that changes the location associated with a time.

// TimeIn returns the time in UTC if the name is "" or "UTC".
// It returns the local time if the name is "Local".
// Otherwise, the name is taken to be a location name in
// the IANA Time Zone database, such as "Africa/Lagos".
func TimeIn(t time.Time, name string) (time.Time, error) {
        loc, err := time.LoadLocation(name)
        if err == nil {
                t = t.In(loc)
        }
        return t, err
}

In use:

for _, name := range []string{
        "",
        "Local",
        "Asia/Shanghai",
        "America/Metropolis",
} {
        t, err := TimeIn(time.Now(), name)
        if err == nil {
                fmt.Println(t.Location(), t.Format("15:04"))
        } else {
                fmt.Println(name, "<time unknown>")
        }
}
UTC 19:32
Local 20:32
Asia/Shanghai 03:32
America/Metropolis <time unknown>

Timezone Corner Cases

Note the following warning from the docs:

A daylight savings time transition skips or repeats times. For example, in the United States, March 13, 2011 2:15am never occurred, while November 6, 2011 1:15am occurred twice. In such cases, the choice of time zone, and therefore the time, is not well-defined. Date returns a time that is correct in one of the two zones involved in the transition, but it does not guarantee which. Package time: Date

Comments

Be the first to comment!