العمل مع التواريخ في Rust: نظرة عامة على المكتبات الرئيسية
يقدم نظام Rust البيئي العديد من المكتبات القوية للعمل مع التواريخ والوقت. على عكس Python مع وحدته المدمجة datetime، توفر المكتبة القياسية في Rust وظائف محدودة فقط (std::time::Instant و Duration)، لذلك للمهام الجادة يجب اللجوء إلى الكريتات الخارجية. في هذه المقالة، سنستعرض ثلاث مكتبات رئيسية: Chrono و Time و Jiff.
1. Chrono — المعيار الفعلي
Chrono هي المكتبة الأكثر شعبية (أكثر من 100 مليون تحميل). توفر مجموعة كاملة من الأدوات للعمل مع التواريخ والوقت والمناطق الزمنية والتنسيق.
الإمكانيات الرئيسية:
NaiveDate،NaiveDateTime— التواريخ والوقت بدون منطقة زمنيةDateTime<Tz>— التاريخ والوقت مرتبط بمنطقة زمنية- دعم
Durationوالعمليات الحسابية - التنسيق عبر
format!وتحليل السلاسل النصية - العمل مع التقاويم (الميلادي، ISO)
مثال كود:
use chrono::{DateTime, Utc, NaiveDate, Duration};
fn main() { // الوقت الحالي في UTC let now: DateTime<Utc> = Utc::now(); println!("الوقت الحالي: {}", now.format("%Y-%m-%d %H:%M:%S"));
// إنشاء تاريخ محدد let date = NaiveDate::from_ymd_opt(2025, 3, 15).unwrap(); println!("التاريخ: {}", date);
// العمليات الحسابية على التواريخ let future = now + Duration::days(30); println!("بعد 30 يومًا: {}", future.format("%d.%m.%Y"));
// تحليل سلسلة نصية let parsed = "2025-01-01 12:00:00" .parse::<DateTime<Utc>>() .expect("تنسيق تاريخ غير صحيح"); println!("تم التحليل: {}", parsed);}Chrono مناسبة تمامًا لمعظم المشاريع، ولكنها قد تكون زائدة عن الحاجة إذا كانت الوظائف الأساسية فقط مطلوبة.
2. Time — بديل حديث
كريت Time (من المطور Jacob Pratt) يُقدم كبديل أكثر أمانًا وسهولة في الاستخدام لـ Chrono. يستخدم كتابة صارمة ويتجنب حالات الذعر (panics) في وقت التشغيل.
الاختلافات الرئيسية:
- جميع العمليات تُرجع
Result— لا توجد حالات ذعر مخفية - نظام أنواع أكثر صرامة: أنواع منفصلة للتواريخ والوقت والإزاحات
- دعم مدمج لـ ISO 8601 و RFC 3339
- حجم أصغر وترجمة أسرع
مثال كود:
use time::{Date, Month, OffsetDateTime, Duration, format_description};
fn main() -> Result<(), time::Error> { // الوقت الحالي let now = OffsetDateTime::now_utc(); println!("الآن: {}", now);
// إنشاء تاريخ (بدون ذعر) let date = Date::from_calendar_date(2025, Month::March, 15)?; println!("التاريخ: {}", date);
// العمليات الحسابية let week_later = now + Duration::weeks(1); println!("بعد أسبوع: {}", week_later);
// تحليل بتنسيق صريح let format = format_description::parse("[year]-[month]-[day]")?; let parsed = Date::parse("2025-12-31", &format)?; println!("التحليل: {}", parsed); Ok(())}Time هو اختيار ممتاز للمشاريع الجديدة حيث تكون الأمان والقابلية للتنبؤ مهمة.
3. Jiff — أحدث لاعب
Jiff (من BurntSushi، مبتكر regex و ripgrep) هي أحدث مكتبة (إصدار 2024). تركز على العمل مع المناطق الزمنية والتدويل.
الميزات:
- قاعدة بيانات مدمجة للمناطق الزمنية (IANA)
- دعم التقاويم غير القياسية (الإسلامية، العبرية، وغيرها)
- عمل متقدم مع الفترات الزمنية والمدد
- أداء عالٍ بفضل الحسابات الكسولة