Как проверить, является ли текущее местное время летним временем? - PullRequest
0 голосов
/ 29 октября 2018

Например, в Ruby есть функция Time#dst?, которая возвращает true в случае перехода на летнее время. Существует ли вызов API стандартной библиотеки Go, чтобы сделать то же самое?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вы можете вывести результат. Например,

package main

import (
    "fmt"
    "time"
)

// isTimeDST returns true if time t occurs within daylight saving time
// for its time zone.
func isTimeDST(t time.Time) bool {
    // If the most recent (within the last year) clock change
    // was forward then assume the change was from std to dst.
    hh, mm, _ := t.UTC().Clock()
    tClock := hh*60 + mm
    for m := -1; m > -12; m-- {
        // assume dst lasts for least one month
        hh, mm, _ := t.AddDate(0, m, 0).UTC().Clock()
        clock := hh*60 + mm
        if clock != tClock {
            if clock > tClock {
                // std to dst
                return true
            }
            // dst to std
            return false
        }
    }
    // assume no dst
    return false
}

func main() {
    pstLoc, err := time.LoadLocation("America/Los_Angeles")
    if err != nil {
        fmt.Println(err)
        return
    }

    utc := time.Date(2018, 10, 29, 14, 0, 0, 0, time.UTC)
    fmt.Println(utc, utc.Location(), ": DST", isTimeDST(utc))
    local := utc.In(time.Local)
    fmt.Println(local, local.Location(), ": DST", isTimeDST(local))
    pst := utc.In(pstLoc)
    fmt.Println(pst, pst.Location(), ": DST", isTimeDST(pst))

    utc = utc.AddDate(0, 3, 0)
    fmt.Println(utc, utc.Location(), ": DST", isTimeDST(utc))
    local = utc.In(time.Local)
    fmt.Println(local, local.Location(), ": DST", isTimeDST(local))
    pst = utc.In(pstLoc)
    fmt.Println(pst, pst.Location(), ": DST", isTimeDST(pst))
}

Выход:

2018-10-29 14:00:00 +0000 UTC UTC : DST false
2018-10-29 10:00:00 -0400 EDT Local : DST true
2018-10-29 07:00:00 -0700 PDT America/Los_Angeles : DST true
2019-01-29 14:00:00 +0000 UTC UTC : DST false
2019-01-29 09:00:00 -0500 EST Local : DST false
2019-01-29 06:00:00 -0800 PST America/Los_Angeles : DST false
0 голосов
/ 29 октября 2018

API Location api не экспортирует значение DST часового пояса. Это было поднято на форуме golang-nuts несколько лет назад. Одно из предложений - сравнить смещение часового пояса 1 января с смещением часового пояса 1 июля. Рабочее решение этого было опубликовано с использованием этого метода. Одно предупреждение: у goplay неправильное местное время, поэтому он не сообщает правильно информацию, если вы запускаете ее там. Вы можете запустить его локально, чтобы убедиться, что он работает.

Другой способ - использовать отражение через пакет рефлекс . Решение, которое я написал для этого, доступно здесь . Есть много проблем с этим методом.

Редактировать: Действительно, вероятно, он должен использовать cacheZone, но выполняет линейный поиск зон, чтобы найти ту, которая соответствует. Это может привести к ошибкам, поскольку некоторые часовые пояса имеют общее имя и смещение. Правильный способ - посмотреть на cacheZone и использовать его, если он установлен. В противном случае вам нужно либо взглянуть на zoneTrans, либо хотя бы посмотреть, как реализован lookup(int64).

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