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

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

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

Начать курс

Работа с датами в Rust: обзор ключевых библиотек

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

1. Chrono — основной стандарт

chrono — самая популярная библиотека для работы с датами в Rust. Она предоставляет полный набор инструментов: парсинг, форматирование, арифметику дат, работу с часовыми поясами и сериализацию через serde.

Установка через Cargo.toml:

[dependencies]
chrono = { version = "0.4", features = ["serde"] }

Пример базового использования:

use chrono::{NaiveDate, NaiveDateTime, Duration, Utc, Local};

fn main() {
    // Текущая дата и время в UTC
    let utc_now = Utc::now();
    println!("Сейчас в UTC: {}", utc_now.format("%Y-%m-%d %H:%M:%S"));

    // Локальное время
    let local_now = Local::now();
    println!("Локальное время: {}", local_now.format("%d.%m.%Y %H:%M"));

    // Создание конкретной даты
    let date = NaiveDate::from_ymd_opt(2025, 3, 14).unwrap();
    println!("Дата: {}", date);

    // Арифметика дат
    let next_week = date + Duration::days(7);
    println!("Через неделю: {}", next_week);

    // Парсинг строки
    let parsed = NaiveDateTime::parse_from_str(
        "2025-12-31 23:59:59",
        "%Y-%m-%d %H:%M:%S"
    ).unwrap();
    println!("Распарсено: {}", parsed);
}

2. Библиотека Time — современная альтернатива

time — более новая и строгая библиотека, разработанная с учётом ошибок chrono. Она предлагает чёткое разделение между типами: Date, Time, OffsetDateTime и PrimitiveDateTime. Поддерживает макросы для удобного создания дат.

Установка:

[dependencies]
time = { version = "0.3", features = ["macros", "serde"] }

Примеры:

use time::{Date, Time, OffsetDateTime, macros::datetime, Duration};

fn main() {
    // Текущее время
    let now = OffsetDateTime::now_utc();
    println!("Сейчас: {}", now);

    // Создание даты через макрос
    let meeting = datetime!(2025-06-15 14:30:00 +03:00);
    println!("Встреча: {}", meeting);

    // Извлечение компонентов
    let date = meeting.date();
    let time = meeting.time();
    println!("Дата: {}, Время: {}", date, time);

    // Вычисление разницы
    let deadline = datetime!(2025-12-31 00:00:00 UTC);
    let diff = deadline - now;
    println!("До дедлайна: {} дней", diff.whole_days());

    // Форматирование
    let formatted = now.format(
        &time::format_description::well_known::Rfc3339
    ).unwrap();
    println!("RFC 3339: {}", formatted);
}

Важно: Библиотека time является частью официального Rust-организации и считается более безопасной, так как избегает паник в большинстве методов (использует Result).

3. Jiff — новая звезда

jiff — относительно новая библиотека, которая фокусируется на эргономике и производительности. Её главная фишка — автоматическое определение часового пояса и встроенная поддержка календарей (Григорианский, Исламский, Иудейский).

Установка:

[dependencies]
jiff = "0.1"

Пример использования:

use jiff::{Zoned, Timestamp, Unit};

fn main() {
    // Текущее время с часовым поясом
    let now = Zoned::now();
    println!("Текущее время: {}", now);

    // Создание из timestamp
    let ts = Timestamp::new(1_700_000_000, 0).unwrap();
    let zoned = ts.to_zoned("Europe/Moscow").unwrap();
    println!("Timestamp в Москве: {}", zoned);

    // Парсинг ISO 8601
    let parsed: Zoned = "2025-08-21T15:00:00[America/New_York]".parse().unwrap();
    println!("Распарсено: {}", parsed);

    // Разница между датами
    let start = Zoned::new(2025, 1, 1, 0, 0, 0, 0, "UTC").unwrap();
    let end = Zoned::new(2025,                    

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