User preferences, scheduling or legal requirements. There are situations where you will need to convert time.Time values to different timezones.
Often you will want to use “named” timezones: Europe/Amsterdam or America/New_York.
On most systems these timezones are stored in a “timezone database”. This database needs to be kept up to date because timezones and their rules change because of social or political reasons.
If you've ever seen a script or dockerfile that updates a tzdata package, now you know why.
The Go time package provides functionality to read timezones from a “IANA Time Zone database”.
There are two functions:
time.LoadLocationlooks in a number of common locations for the database. Optionally you can import thetime/tzdatapackage to embed the database files in your binary.time.LoadLocationFromTZDataallows you to specify a custom path to a database.
Loading and changing location
In this snippet we’ll load a new time.Location reference using the time.LoadLocation function.
By passing this reference to the t.In(loc *time.Location) method we can create a new time.Time value in that new location.
See the example below.
package main
import (
"fmt"
"log"
"time"
)
func main() {
// t1 is in the UTC timezone
t1 := time.Date(2024, 01, 22, 13, 37, 0, 0, time.UTC)
// load the Hong Kong location from the time zone database.
hongKong, err := time.LoadLocation("Asia/Hong_Kong")
if err != nil {
log.Fatalf("failed to load location: %v", err)
}
// t2 represents the same time instant in the Hong Kong timezone (UTC+8)
t2 := t1.In(hongKong)
fmt.Println(t1.String())
fmt.Println(t2.String())
fmt.Printf("same time instant: %v\n", t1.Equal(t2))
}
In this example, we initially have a time value t1 in the UTC location.
We then load the location reference for "Asia/Hong_Kong or quit the program if that fails.
Finally, we call t1.In(hongKong) to create t2 in the Hong Kong location.
t1 and t2 represent the same time instant, but they will have different clock readings. t2 will read 8 hours before t1. Because the Hong Kong timezone is in UTC+8.
Run the example to verify this.
Get my free newsletter periodically*
Used by 500+ developers to boost their Go skills.
*working on a big project as of 2025, will get back to posting on the regular schedule once time allows.