Пакет time предоставляет возможности для измерения и отображения времени.
Все расчёты, связанные с календарём, всегда предполагают григорианский календарь без високосных секунд.
Объект Time
является отображением момента времени с точностью до наносекунды.
Обычно объект Time
передается как значение, а не как указатель. Иными словами, если ваша функция принимает этот объект как один из своих аргументов, то это должен быть time.Time
, а не *time.Time
.
Можно сравнить экземпляры объекта, используя методы Before
, After
и Equal
. Метод Sub
вычитывает свой аргумент из исходного объекта и создает объект Duration
(продолжительность). Метод Add
прибавляет к объекту продолжительность и делает новый объект Time
.Значением по умолчанию для объекта Time
является January 1, year 1, 00:00:00.000000000 UTC
. Вряд ли в реальном коде когда-либо встретится эта дата, тем не менее существует метод IsZero
, который позволит определить это точно.
В пакете time важной является константа Layout
:
01/02 03:04:05PM '06 -0700
Дело в том, что она используется как для форматирования вывода объекта Time
, так и для, например, разбора строки, содержащей преобразование даты в объект Time
. В более привычном для нас виде её можно представить вот так:
Mon Jan 2 15:04:05 MST 2006
На самом деле запомнить её достаточно просто. Если вы посмотрите на классическое представление, то увидите, что логика этой даты - это прибавлять +1 к предыдущему значению. Первый месяц, второе число, три часа, четыре минуты и так далее. Сложность лишь в перепутанных на американский манер, с нашей точки зрения, месяце и дне.
Вот примеры преобразования строки к объекту time.Time
и наоборот:
const longForm = "Jan 2, 2006 at 3:04pm (MST)"
t, _ := time.Parse(longForm, "Feb 3, 2013 at 7:54pm (PST)")
const shortForm = "2006-Jan-02"
t, _ = time.Parse(shortForm, "2013-Feb-03")
Здесь константы содержат шаблон, взятый из константы Layout, а вторым аргументом передаётся строка, которую требуется преобразовать в объект Time
.
Метод Format
принимает шаблон и возвращает строку:
fmt.Println("Unix format:", t.Format(time.UnixDate))
fmt.Println("Custom format", t.Format("Jan 2, 2006 at 3:04pm (MST)"))
Объект Duration
представляет из себя разницу между двумя объектами Time с точностью до наносекунд в виде числа (int64).
t0 := time.Now()
// Прошло сколько-то времени
t1 := time.Now()
fmt.Print("Сколько времени прошло между t1 и t0", t1.Sub(t0))