Работа с датами в Go (Golang): обзор библиотек и пакетов

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с датами в Go (Golang): полный обзор библиотек

Работа с датами и временем — одна из самых частых задач в веб-разработке, аналитике и бэкенде. В Go (Golang) стандартная библиотека time предоставляет мощный, но не всегда интуитивный инструментарий. Для упрощения разработки существует множество сторонних библиотек. В этой статье мы подробно разберём основные подходы и популярные библиотеки для работы с датами в Go.

1. Стандартный пакет time

Пакет time — основа работы с датами и временем в Go. Он включает типы Time, Duration, Location и функции для форматирования, парсинга и арифметики.

Основные возможности:

  • Текущее время: time.Now()
  • Форматирование: метод .Format(layout string) — использует специальный референсный формат Mon Jan 2 15:04:05 MST 2006 (Go родился в 2006 году).
  • Парсинг: функция time.Parse(layout, value string).
  • Арифметика: методы .Add(d Duration), .Sub(t Time), .AddDate(y, m, d int).
  • Часовые пояса: time.LoadLocation(name string) и метод .In(loc *Location).
package main

import (
    "fmt"
    "time"
)

func main() {
    // Текущее время
    now := time.Now()
    fmt.Println("Сейчас:", now)

    // Форматирование
    fmt.Println("Формат RFC3339:", now.Format(time.RFC3339))
    fmt.Println("Кастомный формат:", now.Format("02.01.2006 15:04:05"))

    // Парсинг строки
    parsed, _ := time.Parse("2006-01-02", "2024-03-15")
    fmt.Println("Распарсено:", parsed)

    // Работа с часовыми поясами
    loc, _ := time.LoadLocation("Europe/Moscow")
    moscowTime := now.In(loc)
    fmt.Println("Время в Москве:", moscowTime)

    // Арифметика
    tomorrow := now.AddDate(0, 0, 1)
    fmt.Println("Завтра:", tomorrow.Format("02.01.2006"))
}

Особенность: Go использует уникальный референсный формат (2006-01-02T15:04:05Z07:00), а не привычные YYYY-MM-DD. Это требует привыкания, но зато исключает неоднозначности.

2. Библиотека carbon (аналог Carbon для PHP)

Библиотека carbon — это порт популярной PHP-библиотеки Carbon. Она предоставляет удобный fluent-интерфейс для работы с датами.

Установка:

go get github.com/golang-module/carbon/v2

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

package main

import (
    "fmt"
    "github.com/golang-module/carbon/v2"
)

func main() {
    // Текущая дата
    now := carbon.Now()
    fmt.Println("Сейчас:", now.ToDateTimeString())

    // Создание даты
    date := carbon.CreateFromDate(2024, 3, 15)
    fmt.Println("Дата:", date.ToDateString())

    // Разница между датами
    start := carbon.Parse("2024-01-01")
    end := carbon.Parse("2024-03-15")
    diff := start.DiffInDays(end)
    fmt.Printf("Дней между: %d\n", diff)

    // Человекочитаемые форматы
    fmt.Println("Вчера:", carbon.Yesterday().ToDateString())
    fmt.Println("Завтра:", carbon.Tomorrow().ToDateString())

    // Проверки
    fmt.Println("Сейчас выходной?", now.IsWeekend())
    fmt.Println("Сейчас утро?", now.IsMorning())
}

Преимущества: простой API, поддержка китайских иероглифов, локализация, методы для работы с началом/концом дня, недели, месяца.

3. Библиотека now (минималистичный инструмент)

Библиотека now от автора GORM — это лёгкий инструмент для вычисления начала и конца временных периодов.

Установка:

go get github.com/jinzhu/now

Пример:

package main

import (
    "fmt"
    "github.com/jinzhu/now"
    "time"
)

func main() {
    t := time.Now()

    fmt.Println("Начало дня:", now.BeginningOfDay(t))
    fmt                    

Рекомендаций