العمل مع التواريخ والوقت في Rust: دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في التعامل مع التواريخ والوقت في Rust



التعامل مع التواريخ والوقت هو أحد المهام الأساسية في معظم التطبيقات الحديثة. سواء كان تسجيل الأحداث، حساب المواعيد النهائية، معالجة الطوابع الزمنية من API، أو العمل مع التقويم - لا يمكن الاستغناء عن مكتبة عالية الجودة للتعامل مع الوقت. في نظام Rust البيئي، توفر المكتبة القياسية فقط الإمكانيات الأساسية (std::time::Instant و std::time::Duration)، وهي مناسبة لقياس الأداء، ولكنها ليست كافية للعمل الكامل مع التواريخ التقويمية.



يأتي للمساعدة الكريت chrono - المعيار الفعلي للتعامل مع التواريخ والوقت في Rust. يقدم وظائف واسعة: من إنشاء تواريخ بسيطة إلى العمل مع المناطق الزمنية، التنسيق والحسابات. في هذه المقالة، سنشرح بالتفصيل الإمكانيات الرئيسية لـ chrono، ونقدم أمثلة عملية، ونوضح كيفية تجنب الأخطاء الشائعة.



1. التثبيت والأنواع الأساسية لـ chrono



للبدء، أضف التبعية إلى ملف Cargo.toml الخاص بك:



[dependencies]chrono = "0.4"


بعد ذلك، يمكنك استيراد الأنواع المطلوبة. يقدم Chrono ثلاثة أنواع رئيسية لتمثيل التواريخ والوقت:



  • NaiveDate — تاريخ بدون وقت (سنة، شهر، يوم).
  • NaiveDateTime — تاريخ ووقت بدون مراعاة المنطقة الزمنية.
  • DateTime<Tz> — تاريخ ووقت مرتبط بالمنطقة الزمنية (مثل Utc أو Local).


لننظر إلى مثال بسيط لإنشاء هذه الأنواع:



use chrono::{NaiveDate, NaiveDateTime, DateTime, Utc, Local};

fn main() { // إنشاء تاريخ بسيط (بدون وقت) let date = NaiveDate::from_ymd_opt(2025, 10, 15).unwrap(); println!("التاريخ: {}", date);

// إنشاء وقت بسيط (بدون تاريخ) let time = NaiveTime::from_hms_opt(14, 30, 0).unwrap(); println!("الوقت: {}", time);

// الدمج في NaiveDateTime let naive_dt = NaiveDateTime::new(date, time); println!("Naive datetime: {}", naive_dt);

// الوقت الحالي في UTC والمحلي let now_utc: DateTime<Utc> = Utc::now(); let now_local: DateTime<Local> = Local::now(); println!("الآن UTC: {}", now_utc); println!("الآن محلي: {}", now_local);}


لاحظ استخدام from_ymd_opt و from_hms_opt - فهما يعيدان Option، مما يحمي من إنشاء تواريخ غير صالحة (مثل 32 يناير).



2. تنسيق وتحليل التواريخ



يستخدم Chrono نظام تنسيق قوي يعتمد على محددات، مشابه جداً لـ strftime في C/PHP. هذا يسمح بتحويل التواريخ إلى نصوص والعكس بمرونة.



2.1 تنسيق التاريخ إلى نص



use chrono::{Utc, DateTime};

fn main() { let now: DateTime<Utc> = Utc::now(); // ISO 8601 القياسي println!("ISO: {}", now.to_rfc3339()); // تنسيق مخصص println!("مخصص: {}", now.format("%Y-%m-%d %H:%M:%S")); println!("يوم الأسبوع: {}", now.format("%A")); println!("الشهر: {}", now.format("%B")); println!("سنة-شهر-يوم: {}", now.format("%d.%m.%Y"));}


محددات التنسيق الرئيسية:

  • %Y — السنة (4 أرقام)
  • %m — الشهر (01-12)
  • %d — يوم الشهر (01-31)
  • %H — الساعات (00-23)
  • %M — الدقائق (00-59)
  • %S — الثواني (00-60)
  • %A — الاسم الكامل ليوم الأسبوع
  • %B — الاسم الكامل للشهر


2.2 تحليل نص إلى تاريخ



للتحويل العكسي، يتم استخدام الدالة parse_from_str:



use chrono::{NaiveDateTime, DateTime, Utc, format::ParseResult};                

المدونات

توصيات الكتب