العمل مع التواريخ في C++: نظرة عامة على المكتبات الرئيسية
إدارة التواريخ والوقت هي إحدى المهام الأساسية عند تطوير أي تطبيق جاد. من تسجيل الأحداث إلى حساب الفترات الزمنية وجدولة المهام - توفر C++ للمطور عدة أدوات قوية. في هذه المقالة، سنستعرض ثلاثة مناهج رئيسية: مكتبة المعيار الحديثة std::chrono، والإضافة من Howard Hinnant (التي دخلت جزئياً في C++20)، والمكتبة المثبتة عبر الزمن Boost.DateTime.
1. المكتبة القياسية: std::chrono (C++11 وما بعده)
ابتداءً من C++11، أصبح العمل مع الوقت في المكتبة القياسية أكثر ملاءمة بشكل ملحوظ. توفر std::chrono أنواعاً لتمثيل لحظات الوقت (time_point)، والمدد (duration)، والساعات (clock). ومع ذلك، حتى C++20 لم تكن تحتوي على أدوات ملائمة للعمل مع التواريخ التقويمية (اليوم، الشهر، السنة).
المكونات الرئيسية:
- الساعات (Clocks):
system_clock(وقت النظام)،steady_clock(وقت رتيب للقياسات)،high_resolution_clock(عادةً ما يكون اسماً مستعاراً لأحد الأولى). - المدد (Durations):
std::chrono::seconds،milliseconds،microseconds، إلخ. تسمح بإجراء العمليات الحسابية. - لحظات الوقت (Time points): ربط المدة بنقطة بداية محددة (عصر) للساعة.
مثال: قياس وقت التنفيذ
#include <iostream>#include <chrono>#include <thread>
int main() { auto start = std::chrono::high_resolution_clock::now(); std::this_thread::sleep_for(std::chrono::milliseconds(500)); auto end = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); std::cout << "وقت التنفيذ: " << duration.count() << " مللي ثانية"; return 0;}يوضح هذا الكود قياساً دقيقاً للوقت بدقة تصل إلى المللي ثانية. للعمل مع التواريخ التقويمية في C++20، ظهرت إمكانيات جديدة، ولكن إذا كنت تستخدم معياراً أقدم، فستكون المكتبات التالية مفيدة لك.
2. مكتبة "date" من Howard Hinnant (سلف C++20)
قبل إصدار C++20، أنشأ Howard Hinnant مكتبة date، التي أصبحت المعيار الفعلي للعمل مع التواريخ التقويمية. إنها خفيفة الوزن، ولا تتطلب Boost، وتعمل فوق std::chrono. دخل معظم وظائفها إلى C++20، لكن المكتبة نفسها لا تزال ذات صلة بالمشاريع التي تستخدم C++11/14/17.
الإمكانيات الرئيسية:
- أنواع
year_month_day،year_month،weekday. - تحليل التواريخ من السلاسل النصية (
parse). - تنسيق التواريخ (
format). - جمع/طرح الأيام، الأشهر، السنوات.
- دعم المناطق الزمنية (إضافة
tz.h).
مثال: العمل مع التواريخ
#include <iostream>#include <date/date.h>#include <chrono>
int main() { using namespace date; using namespace std::chrono; // إنشاء تاريخ: 15 مارس 2025 auto d1 = 2025_y / March / 15; std::cout << "التاريخ: " << d1 << ""; // إضافة 30 يوماً auto d2 = d1 + days{30}; std::cout << "بعد 30 يوماً: " << d2 << ""; // الفرق بالأيام auto diff = (d2 - d1).count(); std::cout << "الفرق: " << diff << " يوم"; // الحصول على التاريخ الحالي auto today = floor<days>(system_clock::now()); std::cout << "اليوم: " << year_month_day{today} << ""; return 0;}هذه