oopcode
oopcode

Reputation: 1962

Go: time.Parse() issue

I have the following code:

timeLocal := "01/July/2015:18:12:25 +0900"
inFormat := "02/January/2006:15:04:05 -0700"
parsed, err := time.Parse(inFormat, timeLocal)
if err != nil {
    log.Fatal("Time format was not recognized!")
}

Now, parsing works fine. But when I run:

fmt.Println(timeLocal)
fmt.Println(inFormat)
fmt.Println(parsed)

The output is:

01/July/2015:18:12:25 +0900
02/January/2006:15:04:05 -0700
2015-07-01 18:12:25 +0900 +0900

Should the second +0900 be there? What is the stupid thing that I'm doing? Sorry, it was really a long day, I don't see what I'm missing.

Oh, and the whole file is here:

package main

import (
    "fmt"
    "time"
    "log"
)

func main() {
    timeLocal := "01/July/2015:18:12:25 +0900"
    inFormat := "02/January/2006:15:04:05 -0700"
    parsed, err := time.Parse(inFormat, timeLocal)
    if err != nil {
        log.Fatal("Time format was not recognized!")
    }

    fmt.Println(timeLocal)
    fmt.Println(inFormat)
    fmt.Println(parsed)
}

Upvotes: 2

Views: 441

Answers (2)

tomasz
tomasz

Reputation: 13062

If you look at documentation of time.Time you will see what the default output format is:

String returns the time formatted using the format string:

"2006-01-02 15:04:05.999999999 -0700 MST"

Now you should see what the second +0900 is doing there – this is a location (time zone) name. Since your input format doesn't have a name it will simply repeat an offset.

You can provide name by altering your input format to parse location name. Alternatively you can provide an output format which doesn't print the name, if you don't need it.

Your modified example:

package main

import (
    "fmt"
    "time"
    "log"
)

func main() {
    timeLocal := "01/July/2015:18:12:25 +0900 XYZ"
    inFormat := "02/January/2006:15:04:05 -0700 MST"
    parsed, err := time.Parse(inFormat, timeLocal)
    if err != nil {
        log.Fatal("Time format was not recognized!")
    }

    fmt.Println(timeLocal)
    fmt.Println(inFormat)
    fmt.Println(parsed) // 2015-07-01 18:12:25 +0900 XYZ
    fmt.Println(parsed.Format("02/January/2006:15:04:05 -0700"))
}

http://play.golang.org/p/xVGvlt-M5B

Upvotes: 2

Ainar-G
Ainar-G

Reputation: 36199

The default format used by Time.String is this:

2006-01-02 15:04:05.999999999 -0700 MST

Notice the "MST" part. Since you're not providing the name of the zone, the format just "names" it the same as offset, that is "+0900". If you change that to "+0000", you'll see that this is indeed a time zone name:

2015-07-01 18:12:25 +0000 UTC

If you don't want that, just use a separate format for printing:

myFmt := "2006-01-02 15:04:05.999999999 -0700"
fmt.Println(parsed.Format(myFmt))

Upvotes: 2

Related Questions