Работа с датами в Go (Golang): библиотеки и инструменты
Язык Go (Golang) предлагает мощную стандартную библиотеку time, которая покрывает большинство задач по работе с датами и временем. Однако для сложных операций, таких как парсинг нестандартных форматов, работа с относительными датами или вычисления с бизнес-календарями, сообщество создало ряд полезных библиотек. В этой статье мы рассмотрим как встроенные возможности Go, так и лучшие сторонние пакеты для работы с датами.
1. Встроенная библиотека time
Стандартная библиотека time — это основа для любых операций с датами в Go. Она предоставляет:
- Типы
Time,Duration,Location - Функции для получения текущего времени, создания дат, парсинга и форматирования
- Поддержку часовых поясов и монотонных часов
Получение текущего времени
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println("Текущее время:", now)
fmt.Println("Год:", now.Year())
fmt.Println("Месяц:", now.Month())
fmt.Println("День:", now.Day())
}
Форматирование дат
В Go используется специальный референсный формат: Mon Jan 2 15:04:05 MST 2006 (1,2,3,4,5,6 — цифры в порядке возрастания).
now := time.Now()
fmt.Println(now.Format("2006-01-02 15:04:05")) // 2025-03-15 14:30:00
fmt.Println(now.Format("02 Jan 2006")) // 15 Mar 2025
fmt.Println(now.Format(time.RFC3339)) // 2025-03-15T14:30:00Z
Парсинг строк
dateStr := "2025-03-15 14:30:00"
t, err := time.Parse("2006-01-02 15:04:05", dateStr)
if err != nil {
panic(err)
}
fmt.Println(t) // 2025-03-15 14:30:00 +0000 UTC
Работа с часовыми поясами
loc, _ := time.LoadLocation("Europe/Moscow")
moscowTime := time.Now().In(loc)
fmt.Println("Московское время:", moscowTime.Format("15:04:05"))
2. Библиотека carbon
Пакет github.com/golang-module/carbon — это Go-аналог популярной PHP-библиотеки Carbon. Он предоставляет удобный API для работы с датами, включая относительные даты, человекочитаемые форматы и цепные вызовы.
Установка
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.ToDateString()) // 2025-03-15
// Относительные даты
fmt.Println(now.AddDays(7).ToDateString()) // 2025-03-22
fmt.Println(now.SubMonths(1).ToDateString()) // 2025-02-15
fmt.Println(now.StartOfMonth().ToDateString()) // 2025-03-01
fmt.Println(now.EndOfMonth().ToDateString()) // 2025-03-31
// Человекочитаемые форматы
fmt.Println(now.DiffForHumans()) // 刚刚 (только что)
// Парсинг с поддержкой множества форматов
t := carbon.Parse("2025-03-15 14:30:00")
fmt.Println(t.ToDateTimeString()) // 2025-03-15 14:30:00
// Работа с часовыми поясами
cst := carbon.Now(carbon.NewYork)
fmt.Println(cst.ToDateTimeString()) // время в Нью-Йорке
}
3. Библиотека now
Пакет github.com/jinzhu/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.BeginningOfMonth(t)) // 2025-03-01 00:00:00
fmt.Println(now.EndOfMonth(t)) // 2025-03-31 23:59:59
fmt.Println(now.BeginningOfYear(t)) // 2025-01-01 00: