Работа с датами в 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. Сравнение и рекомендации
- Для повседневных задач (форматирование, разбор, часовые
Также в библиотеке
Тестирование в Swift (iOS/macOS): фреймворки и инструменты
Планировщик задач Java: Quartz Scheduler — полное руководство
Работа с XML в TypeScript: библиотеки для парсинга и создания XML
ts-functional-pipe для TypeScript: полное руководство с примерами
Mongoose Paginate для JavaScript (Node.js): полное руководство с примерами