вторник, 21 июля 2020 г.

Пакет time в Golang, константы

Здесь представлены предопределенные макеты для использования в Time.Format и time.Parse. Эталонное время, используемое в макетах, это конкретное время:

Mon Jan 2 15:04:05 MST 2006

это время Unix 1136239445. Поскольку MST - это GMT-0700, отсчет времени можно рассматривать как

01/02 03:04:05PM '06 -0700

Чтобы определить свой собственный формат, запишите, как будет выглядеть отформатированное эталонное время; посмотрите значения таких констант, как ANSIC, StampMicro или Kitchen, например. Модель должна продемонстрировать, как выглядит эталонное время, чтобы методы Format и Parse могли применять одно и то же преобразование к общему значению времени.

Некоторые допустимые макеты являются недопустимыми значениями времени для time.Parse из-за форматов, таких как _ для заполнения пробелов и Z для информации о зоне.

В строке формата подчеркивание _ представляет пробел, который может быть заменен цифрой, если следующее число (день) имеет две цифры; для совместимости с фиксированными форматами времени Unix.

Десятичная точка, за которой следует один или несколько нулей, представляет собой долю секунды, напечатанную с заданным количеством десятичных знаков. Десятичная точка, за которой следуют одна или несколько девяток, представляет дробную секунду, напечатанную с заданным количеством десятичных знаков, с удалением завершающих нулей. Только при парсинге вход может содержать дробное второе поле сразу после поля секунд, даже если макет не указывает на его наличие. В этом случае десятичная точка, за которой следует максимальный ряд цифр, анализируется как дробная секунда.

Числовой формат смещения часового пояса выглядит следующим образом:

-0700  ±hhmm
-07:00 ±hh:mm
-07    ±hh

Замена знака в формате буквой Z вызывает поведение печати по стандарту ISO 8601 вместо смещения для зоны UTC. Таким образом:

Z0700  Z or ±hhmm
Z07:00 Z or ±hh:mm
Z07    Z or ±hh

Распознанные форматы дня недели - "Mon" и "Monday". Распознаются форматы месяцев: "Jan" и "January".

Форматы 2, _2 и 02 - это не дополненные, дополненные пробелами и дополненные нулями дни месяца. Форматы __2 и 002 - трехсимвольный день года с пробелами и нулями; нет незаполненного формата дня года.

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

Обратите внимание, что форматы RFC822, RFC850 и RFC1123 должны применяться только к местному времени. Применение их к времени UTC будет использовать "UTC" как сокращение часового пояса, в то время как строго говоря, эти RFC требуют использования "GMT" в этом случае. В общем случае RFC1123Z следует использовать вместо RFC1123 для серверов, которые настаивают на этом формате, а RFC3339 следует отдавать предпочтение новым протоколам. RFC3339, RFC822, RFC822Z, RFC1123 и RFC1123Z полезны для форматирования; при использовании с time.Parse они не принимают все форматы времени, разрешенные RFC. Формат RFC3339Nano удаляет завершающие нули из поля секунд и, следовательно, может не правильно сортировать после форматирования.

const (
    ANSIC       = "Mon Jan _2 15:04:05 2006"
    UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
    RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
    RFC822      = "02 Jan 06 15:04 MST"
    RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 с числовой зоной
    RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
    RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
    RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 с числовой зоной
    RFC3339     = "2006-01-02T15:04:05Z07:00"
    RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
    Kitchen     = "3:04PM"
    // Удобные метки времени.
    Stamp      = "Jan _2 15:04:05"
    StampMilli = "Jan _2 15:04:05.000"
    StampMicro = "Jan _2 15:04:05.000000"
    StampNano  = "Jan _2 15:04:05.000000000"
)

Не существует определения единиц Day или больше, чтобы избежать путаницы при переходе на часовой пояс при переходе на летнее время.

Чтобы подсчитать количество единиц в Duration, разделите:

second := time.Second
fmt.Print(int64(second/time.Millisecond)) // печатает 1000

Чтобы преобразовать целое число единиц в Duration, умножьте:

seconds := 10
fmt.Print(time.Duration(seconds)*time.Second) // печатает 10s

const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)


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


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

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