Working with Date and Time in Go
Get latest articles directly in your inbox
In this tutorial we will explore different ways to use time in Go. Golang provides us a package time that provides functionality for measuring and displaying time. This package will be all you need in most of the use cases.
A Time represents an instant in time with nanosecond precision.
Time in Go is based on location and can be used to display multiple formats (Days, hours, seconds). As per unix timestamp standard, even Go starts its time counter as zero on January 1st, 1970 at UTC. The current timestamp at the time of writing this tutorial is 1602249029
Ok, let’s get started with managing time in Go.
How to get current timestamp
The time.Time
object helps us in getting the computation of time. You don’t want to write a function to compute seconds elapsed since 1st Jan, 1970 every time. This is where the time
package comes to save you.
package main
import (
"fmt"
"time"
)
func main() {
localTimeNow := time.Now()
currentSeconds := localTimeNow.Unix()
fmt.Println(“Time object: “, localTimeNow)
fmt.Println(“Time in seconds: “, currentSeconds)
}
time.Now()
returns the time.Time
object. If you look at the output below, you’ll see that the time returned is the current local time. So, this might not be same if you are in different location across the globe.
currentSeconds
represents the seconds passed since the Unix epoch (1 Jan, 1970 00:00:00).
Time object: 2020-10-09 18:52:19.229868 +0530 IST m=+0.000111168
Time in seconds: 1602249739
Time in nanoseconds: 205643000
Fetching Day, Month, Year
Time object provides a lot of other helper methods. You can use methods like Day()
,Month()
, Year()
, Hour()
and lot more as per need. Check all available methods here.
// Fetching current Day, Month and Year
time.Now().Day()
time.Now().Month()
time.Now().Year()
How to get time from timestamp
You might want to check date given a timestamp. Since, calculations in timestamp are easy to perform, people prefer converting to timestamp, performing operations and then converting it back to readable date format. We can use Unix()
method to achieve this.
package main
import (
"fmt"
"time"
)
func main() {
timestamp := int64(1602254086)
date := time.Unix(timestamp, 0)
fmt.Println(“Given timestamp to date : “, date)
}
The above code results in date for given timestamp -
Given timestamp to date : 2020-10-09 20:04:46 +0530 IST
Time is standard formats
Time package provide number of formats in which time can be parsed. Let’s look at an example -
package main
import (
"fmt"
"time"
)
const (
ISOformat = "2006-01-02"
USformat = "January 2, 2006"
RFC850format = "Monday, 02-Jan-06 15:04:05 UTC"
)
func main() {
date := “2020-10-09"
timeInISOformat, _ := time.Parse(ISOformat, date)
fmt.Println(timeInISOformat)
fmt.Println(timeInISOformat.Format(USformat))
fmt.Println(timeInISOformat.Format(RFC850format))
}
The output for above code will be -
2020-10-09 00:00:00 +0000 UTC
October 9, 2020
Friday, 09-Oct-20 00:00:00 UTC
You can find other available formats here.
How to get time at certain location/timezones
The time.Time
objects has a loc *Location
attribute which helps us fetching time at certain timezones. Let’s see how to use this with an example.
Note: The nil location means UTC.
package main
import (
"fmt"
"time"
)
const (
timezoneJakarta = "Asia/Jakarta"
timezoneAmerica = "America/New_York"
)
func main() {
// Current local time (India for me)
localTimeNow := time.Now()
fmt.Println(“Local time in India is: “, localTimeNow)
jakartaLoc, err := time.LoadLocation(timezoneJakarta)
if err != nil {
fmt.Println(err)
}
fmt.Println(“Local time in Jakarta is: “, localTimeNow.In(jakartaLoc))
americaLoc, err := time.LoadLocation(timezoneAmerica)
if err != nil {
fmt.Println(err)
}
fmt.Println(“Local time in US is: “, localTimeNow.In(americaLoc))
}
The above code will print current time in different timezones -
Local time in India is: 2020-10-09 19:31:51.771828 +0530 IST m=+0.000088151
Local time in Jakarta is: 2020-10-09 21:01:51.771828 +0700 WIB
Local time in US is: 2020-10-09 10:01:51.771828 -0400 EDT
Time in UTC, IST and other timezones
In place of specifying full timezone location we can also provide various time in short formats like UTC, IST, EST, MST etc. You can even fetch your current zone using Zone()
method.
package main
import (
"fmt"
"time"
)
func main() {
currentZone, offset := time.Now().Zone()
fmt.Println(“Your Timezone : “, currentZone)
fmt.Println(“Offset in seconds from UTC: “, offset)
utcLoc, err := time.LoadLocation(“UTC”)
if err != nil {
fmt.Println(err)
}
fmt.Println(“Local time UTC is: “, time.Now().In(utcLoc))
}
How to modify date
There are multiple ways to achieve this. Two common one are -
- Converting to timestamp (seconds) and then easily modifying date by adding/subtracting seconds.
- Using
AddDate()
method fromtime
package
Let’s see how it works -
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
// Using AddDate() method
tomorrow := t.AddDate(0, 0, 1)
yesterday := t.AddDate(0, 0, -1)
nextMonth := t.AddDate(0, 1, 0)
nextYear := t.AddDate(1, 0, 0)
fmt.Println(“Tomorrow using AddDate(): “, tomorrow)
fmt.Println(“Yesterday: “, yesterday)
fmt.Println(“Next Month: “, nextMonth)
fmt.Println(“Next Year: “, nextYear)
// Using timestamp
timestamp := t.Unix()
timestampTomorrow := timestamp + 24*60*60
tomorrow = time.Unix(timestampTomorrow, 0)
fmt.Println(“Tomorrow using timestamp: “, tomorrow)
}
The above code prints next day, month and year and explores both method to achieve this.
Tomorrow using AddDate(): 2020-10-10 19:58:09.701298 +0530 IST
Yesterday: 2020-10-08 19:58:09.701298 +0530 IST
Next Month: 2020-11-09 19:58:09.701298 +0530 IST
Next Year: 2021-10-09 19:58:09.701298 +0530 IST
Tomorrow using timestamp: 2020-10-10 19:58:09 +0530 IST
Resources
There is a lot more to learn about Git which is out of scope for this basic articles. Here are some of the resources to learn.
- Time package
- Epoch Time converter - Handy tool to check and convert timestamps
Books to learn Golang
I hope you learned something new. Feel free to suggest improvements ✔️
I share regular updates and resources on Twitter. Let’s connect!
Keep exploring 🔎 Keep learning 🚀
Liked the content? Do support :)