العمل مع التواريخ والوقت في Rust: من الألف إلى الياء
\n\nالعمل مع التواريخ والوقت هو أحد المهام الأساسية في تطوير أي تطبيق: من خدمات الويب إلى أنظمة التسجيل. في Rust، المعروفة بسلامتها وأدائها، يتم تنفيذ العمل مع التواريخ من خلال مكتبة قوية chrono. في هذه المقالة، سنشرح جميع جوانب العمل مع التواريخ والوقت: من العمليات الأساسية إلى المعالجات المعقدة مع المناطق الزمنية.
1. تثبيت وإعداد مكتبة chrono
\n\nتعتبر مكتبة chrono المعيار الفعلي للعمل مع التواريخ والوقت في Rust. توفر مجموعة كاملة من الأدوات: من كائنات التاريخ البسيطة إلى الأنواع المعقدة مع مراعاة المناطق الزمنية.
لبدء العمل، أضف التبعية إلى ملف Cargo.toml:
[dependencies]\nchrono = "0.4"\n\nبعد ذلك، قم باستيراد الوحدات الضرورية إلى الكود الخاص بك:
\n\nuse chrono::{NaiveDate, NaiveDateTime, DateTime, Utc, Local, Duration};\nuse chrono::format::ParseError;\n\n2. أنواع البيانات الأساسية للعمل مع التواريخ
\n\nفي chrono، هناك عدة أنواع رئيسية تغطي جميع احتياجات المطور:
- \n
NaiveDate— تاريخ بدون وقت ومنطقة زمنية (مثال: 2024-01-15). \n NaiveTime— وقت بدون تاريخ ومنطقة زمنية (مثال: 14:30:00). \n NaiveDateTime— مزيج من التاريخ والوقت بدون منطقة زمنية. \n DateTime<Tz>— تاريخ ووقت مع تحديد المنطقة الزمنية (مثال:DateTime<Utc>أوDateTime<Local>). \n
لنلقِ نظرة على مثال لإنشاء كائنات من كل نوع:
\n\n// إنشاء NaiveDate\nlet date = NaiveDate::from_ymd_opt(2024, 1, 15).unwrap();\nprintln!("التاريخ: {}", date); // 2024-01-15\n\n// إنشاء NaiveTime\nlet time = NaiveTime::from_hms_opt(14, 30, 0).unwrap();\nprintln!("الوقت: {}", time); // 14:30:00\n\n// إنشاء NaiveDateTime\nlet datetime = NaiveDateTime::new(date, time);\nprintln!("التاريخ والوقت: {}", datetime); // 2024-01-15 14:30:00\n\n// إنشاء DateTime مع المنطقة الزمنية UTC\nlet utc_datetime = Utc::now();\nprintln!("الوقت الحالي UTC: {}", utc_datetime);\n\n// إنشاء DateTime مع المنطقة الزمنية المحلية\nlet local_datetime = Local::now();\nprintln!("الوقت المحلي الحالي: {}", local_datetime);\n\n3. تنسيق وتحليل التواريخ
\n\nمن أكثر المهام شيوعًا تحويل التواريخ إلى نصوص والعكس. تستخدم chrono سلاسل تنسيق مشابهة لـ strftime من لغة C.
تنسيق التاريخ إلى نص
\n\nللتنسيق، استخدم الطريقة .format():
use chrono::Utc;\n\nlet now = Utc::now();\n\n// تنسيق ISO 8601 القياسي\nprintln!("ISO 8601: {}", now.format("%Y-%m-%dT%H:%M:%S%z"));\n\n// تنسيق باللغة العربية\nprintln!("التنسيق العربي: {}", now.format("%d.%m.%Y %H:%M"));\n\n// التاريخ فقط\nprintln!("التاريخ فقط: {}", now.format("%A, %d %B %Y"));\n\n// الإخراج:\n// ISO 8601: 2024-01-15T14:30:00+0000\n// التنسيق العربي: 15.01.2024 14:30\n// التاريخ فقط: Monday, 15 January 2024\n\nمحددات التنسيق الرئيسية:
\n\n- \n
%Y— السنة (4 أرقام) \n %m— الشهر (01-12) \n %d— اليوم (01-31) \n %H— الساعات (00-23) \n %M— الدقائق (00-59) \n %S— الثواني (00-59) \n %z— إزاحة المنطقة الزمنية \n %A— الاسم الكامل ليوم الأسبوع \n %B— الاسم الكامل للشهر \n
تحليل نص إلى تاريخ
\n\nلتحويل نص إلى تاريخ، استخدم الطريقة parse_from_str():
use chrono::NaiveDate;\nuse chrono::format::ParseError;\n\nfn parse_date(dat