четверг, 23 апреля 2020 г.

Часовые пояса в Golang

Каждое Time имеет соответствующее Location, которое используется для отображения.

Метод In возвращает время с определенным местоположением (location). Изменение местоположения таким образом изменяет только представление; это не меняет момент во времени.

Вот удобная функция, которая изменяет местоположение, связанное со временем.

// TimeIn возвращает время в UTC, если name "" или "UTC".
// Возвращает местное время, если name "Local".
// В противном случае name принимается 
// за name местоположения в базе данных часового пояса IANA, 
// например, "Africa/Lagos".
func TimeIn(t time.Time, name string) (time.Time, error) {
    loc, err := time.LoadLocation(name)
    if err == nil {
        t = t.In(loc)
    }
    return t, err
}

В использовании:

for _, name := range []string{
    "",
    "Local",
    "Asia/Shanghai",
    "America/Metropolis",
} {
    t, err := TimeIn(time.Now(), name)
    if err == nil {
        fmt.Println(t.Location(), t.Format("15:04"))
    } else {
        fmt.Println(name, "<time unknown>")
    }
}

UTC 19:32
Local 20:32
Asia/Shanghai 03:32
America/Metropolis <time unknown>

Предупреждение. Переход на летнее время пропускается или повторяется время. Например, в Соединенных Штатах 13 марта 2011 г. 2:15am никогда не происходило, а 6 ноября 2011 г. 1:15am происходило дважды. В таких случаях выбор часового пояса и, следовательно, времени не является четко определенным. Date возвращает время, которое является правильным в одной из двух зон, участвующих в переходе, но не гарантирует, какая именно.


Читайте также:


Комментариев нет:

Отправить комментарий