Работа с датами в Go (Golang): обзор библиотек для парсинга, форматирования и манипуляций

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

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

Начать курс

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

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