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!