Работа с датами в Go (Golang): обзор библиотек
Работа с датами и временем — одна из ключевых задач в любом языке программирования. В Go (Golang) стандартная библиотека предоставляет мощный пакет time, но иногда для удобства разработчики обращаются к сторонним библиотекам. В этой статье мы разберём основные возможности стандартного пакета и рассмотрим две популярные библиотеки: carbon и now.
1. Стандартный пакет time
Пакет time — это основа для работы с датами в Go. Он включает типы Time, Duration, функции для парсинга, форматирования, работы с таймерами и временными зонами.
Создание и форматирование даты
package main
import (
"fmt"
"time"
)
func main() {
// Текущее время
now := time.Now()
fmt.Println("Сейчас:", now)
// Создание конкретной даты
date := time.Date(2025, time.March, 15, 14, 30, 0, 0, time.UTC)
fmt.Println("Конкретная дата:", date)
// Форматирование (обязательно "2006-01-02 15:04:05" как референс)
fmt.Println("Формат:", date.Format("02.01.2006 15:04:05"))
}
Парсинг строки в дату
func main() {
// Парсинг с указанием формата
str := "2025-03-15 14:30:00"
parsed, err := time.Parse("2006-01-02 15:04:05", str)
if err != nil {
panic(err)
}
fmt.Println("Распарсено:", parsed)
}
Работа с временными зонами
func main() {
loc, _ := time.LoadLocation("Europe/Moscow")
moscowTime := time.Now().In(loc)
fmt.Println("Московское время:", moscowTime)
}
Разница между датами
func main() {
start := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC)
end := time.Date(2025, 12, 31, 23, 59, 59, 0, time.UTC)
duration := end.Sub(start)
fmt.Printf("Разница: %v (часов: %v)\n", duration, duration.Hours())
}
2. Библиотека carbon
Библиотека carbon (github.com/golang-module/carbon) — это порт популярной PHP-библиотеки Carbon для Go. Она предоставляет удобный 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.ToString())
// Создание даты
date := carbon.Parse("2025-03-15 14:30:00")
fmt.Println("Распарсено:", date.ToDateString())
// Добавление дней
future := carbon.Now().AddDays(10)
fmt.Println("Через 10 дней:", future.ToDateString())
// Разница в днях
diff := carbon.Now().DiffInDays(carbon.Parse("2025-12-31"))
fmt.Printf("До Нового года: %d дней\n", diff)
// Форматирование
fmt.Println("Кастомный формат:", carbon.Now().Format("d/m/Y H:i:s"))
}
Удобные методы
StartOfDay()/EndOfDay()— начало/конец дняIsWeekend()/IsWeekday()— проверка дня неделиAge()— возраст от даты рожденияDiffForHumans()— человекочитаемая разница (например, "3 дня назад")
3. Библиотека now
Библиотека now (github.com/jinzhu/now) от создателя GORM — это лёгкая утилита для получения начала и конца временных периодов.
Установка
go get github.com/jinzhu/now
Примеры использования
package main
import (
"fmt"
"time"
"github.com/jinzhu/now"
)
func main() {
// Начало дня
beginningOfDay := now.BeginningOfDay()
fmt.Println("Начало дня:", beginningOfDay)
// Конец месяца
endOfMonth := now.EndOfMonth()
fmt.Println("Конец месяца:", endOfMonth)
// Начало недели (понедель