среда, 29 июля 2020 г.

Пакет time в Golang, функции Parse, ParseInLocation

Функция Parse

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

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

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

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

Предопределенные макеты ANSIC, UnixDate, RFC3339 и другие описывают стандартные и удобные представления эталонного времени.

Элементы, опущенные в value, предполагаются равными нулю или, если ноль невозможен, равны единице, поэтому анализ "3:04pm" возвращает время, соответствующее Jan 1, year 0, 15:04:00 UTC (обратите внимание, что, поскольку год 0, это время до нулевого Time). Годы должны быть в диапазоне 0000..9999. День недели проверяется на синтаксис, но в противном случае он игнорируется.

Для макетов с указанием двузначного года 06 значение NN >= 69 будет рассматриваться как 19NN, а значение NN < 69 будет рассматриваться как 20NN.

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

При анализе времени со смещением зоны, например -0700, если смещение соответствует часовому поясу, используемому текущим местоположением (Local), то Parse использует это местоположение и зону в возвращенном времени. В противном случае он записывает время, как находящееся в сфабрикованном месте, со временем, зафиксированным в заданном смещении зоны.

При разборе времени с аббревиатурой зоны, такой как MST, если аббревиатура зоны имеет определенное смещение в текущем местоположении, то это смещение используется. Аббревиатура зоны "UTC" распознается как UTC независимо от местоположения. Если аббревиатура зоны неизвестна, Parse записывает время, как находящееся в сфабрикованном месте с данной аббревиатурой зоны и нулевым смещением. Этот выбор означает, что такое время может быть проанализировано и переформатировано с той же компоновкой без потерь, но точный момент, используемый в представлении, будет отличаться фактическим смещением зоны. Чтобы избежать таких проблем, предпочитайте временные макеты, которые используют числовое смещение зоны, или используйте ParseInLocation.

Пример использования Parse

package main

import (
    "fmt"
    "time"
)

func main() {
    // longForm показывает в качестве примера, 
    // как эталонное время 
    // будет представлено в желаемом макете.
    const longForm = "Jan 2, 2006 at 3:04pm (MST)"
    t, _ := time.Parse(longForm, "Feb 3, 2013 at 7:54pm (PST)")
    fmt.Println(t)

    // shortForm это другой способ 
    // как будет представлено эталонное время
    // в нужном макете; нет часового пояса.
    // Примечание: без явной зоны возвращает время в UTC.
    const shortForm = "2006-Jan-02"
    t, _ = time.Parse(shortForm, "2013-Feb-03")
    fmt.Println(t)

    // Некоторые допустимые макеты являются 
    // недопустимыми значениями времени 
    // из-за спецификаторов формата
    // например _ для пробела и Z для информации о зоне.
    // Например, макет RFC3339 2006-01-02T15:04:05Z07:00
    // содержит как Z, так и смещение часового пояса 
    // для обработки обеих допустимых опций:
    // 2006-01-02T15:04:05Z
    // 2006-01-02T15:04:05+07:00
    t, _ = time.Parse(time.RFC3339, "2006-01-02T15:04:05Z")
    fmt.Println(t)
    t, _ = time.Parse(time.RFC3339, "2006-01-02T15:04:05+07:00")
    fmt.Println(t)
    _, err := time.Parse(time.RFC3339, time.RFC3339)
    fmt.Println("error", err) 
    // Возвращает ошибку, 
    // поскольку макет не является допустимым значением
    
}

Вывод:

2013-02-03 19:54:00 +0000 PST
2013-02-03 00:00:00 +0000 UTC
2006-01-02 15:04:05 +0000 UTC
2006-01-02 15:04:05 +0700 +0700
error parsing time "2006-01-02T15:04:05Z07:00": extra text: 07:00

Функция ParseInLocation

func ParseInLocation(layout, value string, loc *Location) (Time, error)

ParseInLocation похож на Parse, но отличается двумя важными способами. Во-первых, при отсутствии информации о часовом поясе Parse интерпретирует время как UTC; ParseInLocation интерпретирует время как в переданном местоположении. Во-вторых, когда задано смещение или сокращение зоны, Parse пытается сопоставить его с Local местоположением; ParseInLocation использует переданное местоположение.

Пример использования ParseInLocation

package main

import (
    "fmt"
    "time"
)

func main() {
    loc, _ := time.LoadLocation("Europe/Berlin")

    // Будет искать имя CEST в часовом поясе Europe/Berlin.
    const longForm = "Jan 2, 2006 at 3:04pm (MST)"
    t, _ := time.ParseInLocation(longForm, "Jul 9, 2012 at 5:02am (CEST)", loc)
    fmt.Println(t)

    // Примечание: 
    // без явной зоны возвращает время в указанном location.
    const shortForm = "2006-Jan-02"
    t, _ = time.ParseInLocation(shortForm, "2012-Jul-09", loc)
    fmt.Println(t)

}

Вывод:

2012-07-09 05:02:00 +0200 CEST
2012-07-09 00:00:00 +0200 CEST


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


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

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