Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get equivalent time in another timezone

Tags:

timezone

time

go

I'm trying to compare two times from different timezones, and see whether one is before the other. How would I do this in Go?

Note: Basically I would like sfTime.Before(nyTime) == true, but my example below would have sfTime.Before(nyTime) == false. Suggestions on how to make this happen would be great.


For example, in this code...

layout := "2006-01-02 15:04 MST"
sfTime, _ := time.Parse(layout, "2017-03-01 12:00 PDT")
nyTime, _ := time.Parse(layout, "2017-03-01 12:00 EDT")

fmt.Printf("Are these times equal? %v\n", sfTime.Equal(nyTime))

This prints:

Are these times equal? true

Playground link here.

Unintuitively, even if you set them to be the same timezone, this only changes the timezone, but not the HH:mm value.

layout := "2006-01-02 15:04 MST"
sfTime, _ := time.Parse(layout, "2017-03-01 12:00 PDT")
nyTime, _ := time.Parse(layout, "2017-03-01 12:00 EDT")

// Set timezone to UTC
utcLocation, _ := time.LoadLocation("UTC")
sfTime = sfTime.In(utcLocation)
nyTime = nyTime.In(utcLocation)

// Timezones should not be equal, but they are
fmt.Printf("Are these times still equal? %v\n", sfTime.Equal(nyTime))
fmt.Printf("The New York Time: %v\n", nyTime)

Prints

Are these times still equal? true

The New York Time: 2017-03-01 12:00:00 +0000 UTC

Playground link.

like image 867
hlin117 Avatar asked Mar 21 '17 23:03

hlin117


People also ask

How do you calculate time in different zones?

You have to divide the longitude, in degrees, by 15 to find the appropriate time zone, in hours. For example: At 150 degrees west (or 150° W) longitude, the time should be 150 degrees divided by 15 degrees = 10 hours behind UTC, or UTC-10.

How do I convert time to different time zones in Excel?

To use the Time Zone function, first select the cell where you want the converted time to appear. Then click on the Formulas tab and select Insert Function. In the Insert Function dialog box, scroll down until you see the TIMEZONE function and select it. Click OK.


1 Answers

Don't use the Go Playground for time calculations. It runs in a sandbox with a fake time:

About the Playground

The Go Playground is a web service that runs on golang.org's servers. The service receives a Go program, compiles, links, and runs the program inside a sandbox, then returns the output.

There are limitations to the programs that can be run in the playground.

In the playground the time begins at 2009-11-10 23:00:00 UTC (determining the significance of this date is an exercise for the reader). This makes it easier to cache programs by giving them deterministic output.

Also, all times in the Go Playground use the UTC time zone. The Go Playground doesn't use the IANA Time Zone Database.

For example, for this program,

package main

import (
    "fmt"
    "time"
)

func main() {
    layout := "2006-01-02 15:04 MST"
    sfTime, err := time.Parse(layout, "2017-03-01 12:00 PDT")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(sfTime, sfTime.UTC())
    nyTime, err := time.Parse(layout, "2017-03-01 12:00 EDT")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(nyTime, nyTime.UTC())
    fmt.Printf("Are these times equal? %v\n", sfTime.Equal(nyTime))
}

Output from the Go Playground is:

2017-03-01 12:00:00 +0000 PDT 2017-03-01 12:00:00 +0000 UTC
2017-03-01 12:00:00 +0000 EDT 2017-03-01 12:00:00 +0000 UTC
Are these times equal? true

For the correct output, run the program using the Go gc or gccgo compiler:

$ go run equal.go
2017-03-01 12:00:00 +0000 PDT 2017-03-01 12:00:00 +0000 UTC
2017-03-01 11:00:00 -0500 EST 2017-03-01 16:00:00 +0000 UTC
Are these times equal? false

Using the Go gc or gccgo compiler then sfTime.Before(nyTime) == true:

package main

import (
    "fmt"
    "time"
)

func main() {
    layout := "2006-01-02 15:04 MST"
    sfTime, err := time.Parse(layout, "2017-03-01 12:00 PDT")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(sfTime, sfTime.UTC())
    nyTime, err := time.Parse(layout, "2017-03-01 12:00 EDT")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(nyTime, nyTime.UTC())
    fmt.Printf("Is the SF time before the NY time? %v\n", sfTime.Before(nyTime))
}

Output:

$ go run before.go
2017-03-01 12:00:00 +0000 PDT 2017-03-01 12:00:00 +0000 UTC
2017-03-01 11:00:00 -0500 EST 2017-03-01 16:00:00 +0000 UTC
Is the SF time before the NY time? true

The Go time package comparison methods (Equal, Before, and After) compare UTC values.

like image 64
peterSO Avatar answered Oct 24 '22 01:10

peterSO