Проблема преобразования времени на языке go - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь понять проблему с преобразованием времени на языке Go. Вот пример кода:

package main

import (
    "fmt"
    "time"
)

func unix2Str(ts int64) string {
    const layout = "20060102"
    t := time.Unix(ts, 0)
    return t.Format(layout)
}

func unixTime(ts string) int64 {
    const layout = "20060102"
    t, err := time.Parse(layout, ts)
    if err != nil {
            fmt.Println(err)
            return 0
    }
    return t.Unix()
}
func main() {
    ts1 := "20110320"
    ts2 := "20110321"

    ut1 := unixTime(ts1)
    ut2 := unixTime(ts2)

    fmt.Println(ts1, ut1, unix2Str(ut1))
    fmt.Println(ts2, ut2, unix2Str(ut2))
}

Он печатает следующий вывод:

20110320 1300579200 20110319
20110321 1300665600 20110320

Но так как я делаю преобразование из строкового формата в Unix и обратно, я ожидаю, что те же результаты для даты в строковом формате. Но это не так. Фактически, напечатанное время Unix 1300579200 преобразуется в Python в исходную дату, с которой я начал, например,

>>> time.strftime("%Y%m%d", time.gmtime(1300579200))
'20110320'

Это ошибка в коде Go или я что-то упустил?

1 Ответ

0 голосов
/ 25 апреля 2018

Это из-за разницы между вашим местным часовым поясом и UTC. Parse вернуло UTC время и Unix вернуло местное время. Например,

package main

import (
    "fmt"
    "time"
)

func unix2Str(ts int64) string {
    const layout = "20060102"
    t := time.Unix(ts, 0)
    fmt.Println(t)
    return t.Format(layout)
}

func unixTime(ts string) int64 {
    const layout = "20060102"
    t, err := time.Parse(layout, ts)
    if err != nil {
        fmt.Println(err)
        return 0
    }
    fmt.Println(t)
    return t.Unix()
}

func main() {
    ts1 := "20110320"
    ts2 := "20110321"

    ut1 := unixTime(ts1)
    ut2 := unixTime(ts2)

    fmt.Println(ts1, ut1, unix2Str(ut1))
    fmt.Println(ts2, ut2, unix2Str(ut2))
}

Выход:

2011-03-20 00:00:00 +0000 UTC
2011-03-21 00:00:00 +0000 UTC
2011-03-19 20:00:00 -0400 EDT
20110320 1300579200 20110319
2011-03-20 20:00:00 -0400 EDT
20110321 1300665600 20110320

func Parse

func Parse(layout, value string) (Time, error)

Разбор разбирает отформатированную строку и возвращает значение времени представляет собой. Макет определяет формат, показывая, как ссылка время, определенное как

Mon Jan 2 15:04:05 -0700 MST 2006

будет интерпретироваться, если бы это было значение; это служит примером формат ввода. То же самое толкование будет затем сделано для входная строка.

При отсутствии индикатора часового пояса Parse возвращает время в UTC.


func Unix

func Unix(sec int64, nsec int64) Time

Unix возвращает местное время, соответствующее заданному времени Unix, сек секунды и нсек наносекунды с 1 января 1970 года по Гринвичу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...