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.
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.LoadLocation
looks in a number of common locations for the database. Optionally you can import thetime/tzdata
package to embed the database files in your binary.time.LoadLocationFromTZData
allows 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 every second week
Used by 500+ developers to boost their Go skills.
"I'll share tips, interesting links and new content. You'll also get a brief guide to time for developers for free."