Golang : Handle or parse date string with Z suffix(RFC3339) example
You want to convert a RFC3339 date string with Z suffix such as 2016-09-01T15:23:01Z
to Golang's time.Time
date type.
NOTE: The Z suffix in a given date string simply means UTC.
Below is an example on how to convert RFC3339 date string with Z suffix to time.Time
type. Example is taken and modify from the previous tutorial on converting date string to time.Time
variants.
Here you go!
package main
import (
"fmt"
"os"
"time"
)
func main() {
dateString := "2016-09-01T15:23:01Z"
fmt.Printf("Input : %s\n", dateString)
//convert date string of RFC3339 to time.Time type
// see RFC3339 in https://golang.org/pkg/time/#pkg-constants
// or if you prefer, you can see layOut as:
//layOut := "2006-01-02T15:04:05Z07:00" // yyyy-dd-MM
dateStamp, err := time.Parse(time.RFC3339, dateString)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Printf("Output(local date) : %s\n", dateStamp.Local())
fmt.Printf("Output(UTC) : %s\n", dateStamp)
// format to E, MMM d yyyy
convertedDateString := dateStamp.Format("Mon 2-Jan-2006")
fmt.Printf("Output : %s\n", convertedDateString)
fmt.Printf("Full output : %s\n", dateStamp.Format("Monday 2-January-2006"))
location, err := time.LoadLocation("America/New_York")
if err != nil {
fmt.Println(err)
}
fmt.Println("Location : ", location, " Time : ", dateStamp.In(location))
location, _ = time.LoadLocation("Asia/Tokyo")
fmt.Println("Location : ", location, " Time : ", dateStamp.In(location))
}
Output:
Input : 2016-09-01T15:23:01Z
Output(local date) : 2016-09-01 23:23:01 +0800 SGT
Output(UTC) : 2016-09-01 15:23:01 +0000 UTC
Output : Thu 1-Sep-2016
Full output : Thursday 1-September-2016
Location : America/New_York Time : 2016-09-01 11:23:01 -0400 EDT
Location : Asia/Tokyo Time : 2016-09-02 00:23:01 +0900 JST
On the side note, even if the given date string does not have the Z
suffix - such as 2016-09-01T10:15:30+08:00
You still can parse the date string.
package main
import (
"fmt"
"os"
"time"
)
func main() {
dateString := "2016-09-01T10:15:30+08:00"
fmt.Printf("Input : %s\n", dateString)
//convert date string of RFC3339 to time.Time type
// see RFC3339 in https://golang.org/pkg/time/#pkg-constants
// or if you prefer, you can see layOut as:
//layOut := "2006-01-02T15:04:05Z07:00" // yyyy-dd-MM
dateStamp, err := time.Parse(time.RFC3339, dateString)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Printf("Output(local date) : %s\n", dateStamp.Local())
fmt.Printf("Output(UTC) : %s\n", dateStamp)
// format to E, MMM d yyyy
convertedDateString := dateStamp.Format("Mon 2-Jan-2006")
fmt.Printf("Output : %s\n", convertedDateString)
fmt.Printf("Full output : %s\n", dateStamp.Format("Monday 2-January-2006"))
location, err := time.LoadLocation("America/New_York")
if err != nil {
fmt.Println(err)
}
fmt.Println("Location : ", location, " Time : ", dateStamp.In(location))
location, _ = time.LoadLocation("Asia/Tokyo")
fmt.Println("Location : ", location, " Time : ", dateStamp.In(location))
}
Input : 2016-09-01T10:15:30+08:00
Output(local date) : 2016-09-01 10:15:30 +0800 SGT
Output(UTC) : 2016-09-01 10:15:30 +0800 SGT
Output : Thu 1-Sep-2016
Full output : Thursday 1-September-2016
Location : America/New_York Time : 2016-08-31 22:15:30 -0400 EDT
Location : Asia/Tokyo Time : 2016-09-01 11:15:30 +0900 JST
References:
https://golang.org/pkg/time/#pkg-constants
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
// Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
See also : Golang : Convert date string to variants of time.Time type examples
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+51.6k Golang : How to get time in milliseconds?
+8.5k Golang : Combine slices but preserve order example
+17k Golang : Check if IP address is version 4 or 6
+29.2k Golang : Login(Authenticate) with Facebook example
+4.6k Python : Find out the variable type and determine the type with simple test
+33.3k Golang : All update packages with go get command
+8.6k Golang : Populate or initialize struct with values example
+8.2k PHP : How to parse ElasticSearch JSON ?
+7.6k Golang : Regular Expression find string example
+27.5k Golang : Decode/unmarshal unknown JSON data type with map[string]interface
+5.9k Golang & Javascript : How to save cropped image to file on server
+10.2k Golang : Allow Cross-Origin Resource Sharing request