Работа с датами в 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, Также в библиотеке
Мониторинг приложений на Rust: библиотеки и инструменты для отслеживания производительности
Кэширование в C++: библиотека Cache++
Работа с S3 и облачными хранилищами в Java: AWS SDK и MinIO
Moq для C# (.NET): полное руководство с примерами
Валидация данных в C# (.NET): библиотеки, атрибуты и FluentValidation