العمل مع التواريخ في C++: نظرة عامة على المكتبات للتعامل مع الوقت

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

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

ابدأ الدورة

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


هذه

توصيات