Работа с датами в Go (Golang): библиотеки time, carbon и now

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

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

Начать курс

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

    // Начало недели (понедель                    

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