Работа с датами в 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