مقدمة في التعامل مع التواريخ والوقت في Rust
يعد التعامل مع التواريخ والوقت من المهام الأساسية في أي تطبيق حديث. سواء كان ذلك لتسجيل الأحداث، أو جدولة المهام، أو معالجة بيانات المستخدم، أو العمل مع واجهات برمجة التطبيقات (API) — لا يمكن الاستغناء عن إدارة الطوابع الزمنية بشكل صحيح. في لغة Rust، المعروفة بأدائها وأمانها، توفر المكتبة القياسية فقط مجموعة أدنى من الأدوات للعمل مع الوقت. ولكن تأتي القوة من الكريت القوي chrono، الذي أصبح المعيار الفعلي للتعامل مع التواريخ والوقت في نظام Rust البيئي.
في هذه المقالة، سنشرح بالتفصيل كيفية تثبيت واستخدام chrono، وكيفية إنشاء التواريخ وتنسيقها وتحليلها ومعالجتها، بالإضافة إلى كيفية العمل مع المناطق الزمنية والطوابع الزمنية لنظام Unix.
تثبيت وإضافة كريت chrono
للبدء، تحتاج إلى إضافة التبعية chrono إلى ملف Cargo.toml الخاص بمشروعك:
[dependencies]
chrono = "0.4"
بعد ذلك، يمكنك استيراد الأنواع والـ traits اللازمة في الكود:
use chrono::{DateTime, Utc, Local, NaiveDate, NaiveDateTime, Duration, Datelike, Timelike, TimeZone};
يقدم كريت chrono عدة أنواع رئيسية لتمثيل التواريخ والوقت:
NaiveDate— تاريخ بدون وقت أو منطقة زمنية (مثال: 2024-01-15).NaiveTime— وقت بدون تاريخ أو منطقة زمنية (مثال: 14:30:00).NaiveDateTime— مزيج من التاريخ والوقت دون مراعاة المنطقة الزمنية.DateTime<Utc>— تاريخ ووقت مع المنطقة الزمنية UTC.DateTime<Local>— تاريخ ووقت مع المنطقة الزمنية المحلية للنظام.DateTime<FixedOffset>— تاريخ ووقت مع إزاحة عشوائية عن UTC.
إنشاء والحصول على الوقت الحالي
أبسط طريقة للحصول على اللحظة الزمنية الحالية هي استخدام الدالتين Utc::now() و Local::now():
use chrono::{Utc, Local};
fn main() {
let utc_now: DateTime<Utc> = Utc::now();
let local_now: DateTime<Local> = Local::now();
println!("الوقت الحالي UTC: {}", utc_now);
println!("الوقت المحلي الحالي: {}", local_now);
}
لإنشاء تاريخ محدد، يمكن استخدام الدالتين NaiveDate::from_ymd و NaiveDateTime::new:
use chrono::{NaiveDate, NaiveDateTime, NaiveTime};
fn main() {
// إنشاء تاريخ 15 مارس 2024
let date = NaiveDate::from_ymd(2024, 3, 15);
println!("التاريخ: {}", date);
// إنشاء وقت 10:30:00
let time = NaiveTime::from_hms(10, 30, 0);
println!("الوقت: {}", time);
// مزيج من التاريخ والوقت
let datetime = NaiveDateTime::new(date, time);
println!("التاريخ والوقت: {}", datetime);
}
يمكنك أيضًا إنشاء تاريخ مع منطقة زمنية باستخدام الدالة and_hms على التاريخ:
use chrono::{Utc, TimeZone};
fn main() {
let datetime_utc = Utc.ymd(2024, 12, 25).and_hms(12, 0, 0);
println!("عيد الميلاد UTC: {}", datetime_utc);
}
تنسيق وتحليل التواريخ
تنسيق الإخراج
لتحويل التاريخ إلى سلسلة نصية، يتم استخدام الدالة format التي تأخذ سلسلة تنسيق. محددات التنسيق مشابهة لتلك الموجودة في لغة Python ولغات أخرى:
use chrono::{Utc, DateTime};
fn main() {
let now = Utc::now();
// تنسيق أساسي
println!("الافتراضي: {}", now.format("%Y-%m-%d %H:%M:%S"));
println!("التاريخ فقط: {}", now.format("%d.%m.%Y"));
println!("مع اسم الشهر: {}", now.format("%d %B %Y"));
println!("الوقت بالثواني: {}", now.format("%H:%M:%S"));
println!("Unix timestamp
```