العمل مع التواريخ في 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_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