Показаны сообщения с ярлыком Время и дата в Golang. Показать все сообщения
Показаны сообщения с ярлыком Время и дата в Golang. Показать все сообщения

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

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

Пакет time обеспечивает функциональность для измерения и отображения времени.

Календарные вычисления всегда предполагают григорианский календарь, без високосных секунд.

Монотонные часы

Операционные системы предоставляют как "настенные часы", которые могут быть изменены для синхронизации часов, так и "монотонные часы", которые не могут быть изменены для синхронизации часов. Общее правило заключается в том, что настенные часы предназначены для определения времени, а монотонные часы - для измерения времени. Вместо того, чтобы разделять API, в этом пакете Time, возвращаемое time.Now содержит как чтение настенных часов, так и чтение монотонных часов; в более поздних операциях с указанием времени используется считывание настенных часов, а в более поздних операциях измерения времени, в частности сравнения и вычитания, используется монотонное считывание часов.

Например, этот код всегда вычисляет положительное прошедшее время, равное приблизительно 20 миллисекундам, даже если настенные часы меняются во время рассчитываемой операции:

start := time.Now()
... операция, которая занимает 20 миллисекунд ...
t := time.Now()
elapsed := t.Sub(start)

Другие идиомы, такие как time.Since(start), time.Until(deadline), и time.Now().Before(deadline), одинаково устойчивы к сбросам настенных часов.

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

Время, возвращаемое time.Now содержит монотонное чтение часов. Если время t имеет монотонные показания часов, t.Add добавляет одинаковую длительность как к настенным часам, так и к показаниям монотонных часов, чтобы вычислить результат. Поскольку t.AddDate(y, m, d), t.Round(d) и t.Truncate(d) являются вычислениями времени по настенным часам, они всегда удаляют любые монотонные показания часов из своих результатов. Поскольку t.In, t.Local и t.UTC используются для их влияния на интерпретацию настенного времени, они также удаляют любые монотонные показания часов из своих результатов. Канонический способ снять монотонное чтение часов - использовать t = t.Round(0).

Если времена t и u содержат монотонные показания часов, операции t.After(u), t.Before(u), t.Equal(u) и t.Sub(u) выполняются с использованием только монотонных показаний часов, игнорируя показания настенных часов. Если ни t, ни u не содержат монотонных показаний часов, эти операции сводятся к использованию показаний настенных часов.

В некоторых системах монотонные часы остановятся, если компьютер перейдет в спящий режим. В такой системе t.Sub(u) может не точно отражать фактическое время, прошедшее между t и u.

Поскольку монотонное чтение часов не имеет смысла вне текущего процесса, сериализованные формы, сгенерированные t.GobEncode, t.MarshalBinary, t.MarshalJSON и t.MarshalText, опускают монотонное чтение часов, и t.Format не предоставляет для него никакого формата. Аналогично, конструкторы time.Date, time.Parse, time.ParseInLocation и time.Unix, а также демаршалеры t.GobDecode, t.UnmarshalBinary. t.UnmarshalJSON и t.UnmarshalText всегда создают времена без монотонного чтения часов.

Обратите внимание, что оператор Go == сравнивает не только момент времени, но и местоположение и показания монотонных часов.

Для отладки результат t.String включает монотонное чтение часов, если оно присутствует. Если t != u из-за различных монотонных показаний часов, эта разница будет видна при печати t.String() и u.String().


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


понедельник, 25 мая 2020 г.

Время не число в Golang

Почему не компилируется?

n := 100
time.Sleep(n * time.Millisecond)

invalid operation: n * time.Millisecond (mismatched types int and time.Duration)

Ответ

В Go нет смешивания числовых типов. Вы можете умножить time.Duration только на

  • другой time.Duration или
  • нетипизированную целочисленную константу.

Вот три правильных примера.

var n time.Duration = 100
time.Sleep(n * time.Millisecond)

const n = 100
time.Sleep(n * time.Millisecond)

time.Sleep(100 * time.Millisecond)

Смотрите нетипизированные числовые константы без ограничений для деталей о типизированных и нетипизированных целочисленных и константах с плавающей запятой и их пределах.


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


понедельник, 13 апреля 2020 г.

Форматирование времени и даты в Golang

Go не использует формат yyyy-mm-dd для форматирования времени. Вместо этого вы форматируете специальный параметр макета (layout)

Mon Jan 2 15:04:05 MST 2006

так же, как время или дата должны быть отформатированы. (Эту дату легче запомнить, когда она написана как 01/02 03:04:05PM ‘06 -0700.)

const (
    layoutISO = "2006-01-02"
    layoutUS  = "January 2, 2006"
)
date := "1999-12-31"
t, _ := time.Parse(layoutISO, date)
fmt.Println(t)                  
// 1999-12-31 00:00:00 +0000 UTC

fmt.Println(t.Format(layoutUS)) 
// December 31, 1999

  • Функция time.Parse разбирает строку даты
  • Функция Format форматирует time.Time

Они имеют следующие сигнатуры:

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

Стандартные форматы времени и даты

Go layout Примечание
January 2, 2006
01/02/06
Jan-02-06
Date
15:04:05
3:04:05 PM
Time
Jan _2 15:04:05
Jan _2 15:04:05.000000
Timestamp с микросекундами
2006-01-02T15:04:05-0700
2006-01-02
15:04:05
ISO 8601 (RFC 3339)
02 Jan 06 15:04 MST
02 Jan 06 15:04 -0700
RFC 822 с числовой зоной
Mon, 02 Jan 2006 15:04:05 MST
Mon, 02 Jan 2006 15:04:05 -0700
RFC 1123 с числовой зоной

Также доступны следующие предопределенные константы формата даты и времени.

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"
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"
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"

Параметры макета

Тип Параметры
Год 06 2006
Месяц 01 1 Jan January
День 02 2 _2 (ширина 2, выравнивание справа)
День недели Mon Monday
Часы 03 3 15
Минуты 04 4
Секунды 05 5
ms μs ns .000 .000000 .000000000
ms μs ns .999 .999999 .999999999 (завершающие нули удалены)
am/pm PM pm
Timezone (временная зона) MST
Смещение -0700 -07 -07:00 Z0700 Z07:00

Крайние случаи

Невозможно указать, что час должен отображаться без начального нуля в 24-часовом формате времени.

Нельзя указывать полночь как 24:00 вместо 00:00. Типичное использование для этого будет давать часы работы, заканчивающиеся в полночь, например, с 07:00 до 24:00.

Невозможно указать время, содержащее високосную секунду: 23:59:60. Фактически, пакет времени предполагает григорианский календарь без високосных секунд.


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