العمل مع التواريخ في Rust: مكتبات الوقت والتقويم
Rust هي لغة برمجة أنظمة حديثة توفر كتابة صارمة وأمانًا للذاكرة. ومع ذلك، توفر المكتبة القياسية لـ Rust فقط أدوات أساسية للعمل مع التواريخ والوقت. للعمل الكامل مع التقاويم والمناطق الزمنية والتنسيق والحسابات، يستخدم المطورون حزمًا خارجية (crates). في هذه المقالة، سنستعرض بالتفصيل ثلاث مكتبات رئيسية: 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));}المزايا: ملائمة للتقويم