Работа с датами в Rust: обзор библиотек для времени и календаря

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

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

Начать курс

Работа с датами в Rust: библиотеки для времени и календаря

Rust — современный системный язык программирования, который предлагает строгую типизацию и безопасность памяти. Однако стандартная библиотека Rust предоставляет лишь минимальные средства для работы с датами и временем. Для полноценной работы с календарями, часовыми поясами, форматированием и вычислениями разработчики используют сторонние крейты. В этой статье мы подробно разберём три основные библиотеки: chrono, time и jiff, а также приведём практические примеры.

1. Библиотека chrono — де-факто стандарт

chrono — самая популярная библиотека для работы с датами в Rust. Она предоставляет богатый API для создания, манипуляции и форматирования дат и времени. Основные типы: NaiveDate, NaiveDateTime, DateTime (с учётом часового пояса) и Duration.

Установка

# Cargo.toml
[dependencies]
chrono = "0.4"

Пример: текущая дата и время

use chrono::{Local, Utc};

fn main() {
    let now_utc = Utc::now();
    let now_local = Local::now();
    println!("UTC: {}", now_utc);
    println!("Local: {}", now_local);
}

Пример: разбор строки и форматирование

use chrono::NaiveDate;

fn main() {
    let date = NaiveDate::parse_from_str("2025-03-15", "%Y-%m-%d")
        .expect("Неверный формат даты");
    println!("День: {}", date.format("%d.%m.%Y"));
}

Плюсы: огромное сообщество, поддержка часовых поясов через chrono-tz, работа с интервалами и длительностями.

Минусы: относительно большой размер, сложность при работе с нестандартными календарями.

2. Библиотека time — лёгкая альтернатива

time — более современная и лёгкая библиотека, которая активно развивается. Она использует строгую систему типов для предотвращения ошибок (например, разделение на Date, Time, OffsetDateTime и PrimitiveDateTime).

Установка

[dependencies]
time = "0.3"

Пример: создание даты и вычисление разницы

use time::{Date, Month, Duration};

fn main() {
    let start = Date::from_calendar_date(2025, Month::March, 10).unwrap();
    let end = Date::from_calendar_date(2025, Month::March, 20).unwrap();
    let diff = end - start;
    println!("Разница: {} дней", diff.whole_days());
}

Пример: форматирование

use time::OffsetDateTime;
use time::format_description::well_known::Rfc3339;

fn main() {
    let now = OffsetDateTime::now_utc();
    let formatted = now.format(&Rfc3339).unwrap();
    println!("RFC 3339: {}", formatted);
}

Плюсы: малый размер, чёткое разделение типов, отличная документация.

Минусы: меньше примеров в интернете, чем у chrono.

3. Библиотека jiff — для высокоточных интервалов

jiff — специализированная библиотека для работы с календарными интервалами и повторяющимися событиями. Она полезна для задач планирования, напоминаний и расчёта рабочих дней.

Установка

[dependencies]
jiff = "0.1"

Пример: создание интервала и проверка вхождения

use jiff::ZonedInterval;
use jiff::tz::TimeZone;

fn main() {
    let tz = TimeZone::get("Europe/Moscow").unwrap();
    let start = tz.to_zoned(2025, 3, 1, 0, 0, 0, 0).unwrap();
    let end = tz.to_zoned(2025, 3, 31, 23, 59, 59, 0).unwrap();
    let interval = ZonedInterval::new(start, end);
    let check = tz.to_zoned(2025, 3, 15, 12, 0, 0, 0).unwrap();
    println!("Входит ли 15 марта в интервал? {}", interval.contains(&check));
}

Плюсы: удобна для календарных расчётов, поддерживает повторения.

Минусы: узкая специализация, не подходит для общих задач.

4. Сравнение и рекомендации

  • Для повседневных задач (форматирование, разбор, часовые

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