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

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

Объект Time

Объект Time является отображением момента времени с точностью до наносекунды.

Обычно объект Time передается как значение, а не как указатель. Иными словами, если ваша функция принимает этот объект как один из своих аргументов, то это должен быть time.Time, а не *time.Time.

Можно сравнить экземпляры объекта, используя методы BeforeAfter и Equal. Метод Sub вычитывает свой аргумент из исходного объекта и создает объект Duration (продолжительность). Метод Add прибавляет к объекту продолжительность и делает новый объект Time.Значением по умолчанию для объекта Time является January 1, year 1, 00:00:00.000000000 UTC. Вряд ли в реальном коде когда-либо встретится эта дата, тем не менее существует метод IsZero, который позволит определить это точно.

Layout

В пакете 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

Объект Duration представляет из себя разницу между двумя объектами Time с точностью до наносекунд в виде числа (int64).

t0 := time.Now()
// Прошло сколько-то времени
t1 := time.Now()
fmt.Print("Сколько времени прошло между t1 и t0", t1.Sub(t0))