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

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

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

ابدأ الدورة

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



العمل مع التواريخ والوقت هو أحد المهام الأساسية في البرمجة. في لغة C++، كانت المكتبة القياسية لفترة طويلة محدودة بالأدوات المساعدة من لغة C (<ctime>)، والتي كانت غير ملائمة وغير آمنة من حيث الأنواع. ابتداءً من C++11 وخاصة C++20، تغير الوضع بشكل جذري. في هذه المقالة، سنستعرض ثلاثة أساليب رئيسية للعمل مع التواريخ في لغة C++ الحديثة.



1. المكتبة القياسية <chrono> (C++11 و C++20)



ابتداءً من C++11، تم تضمين العنوان <chrono> في المكتبة القياسية، والذي يوفر ساعات آمنة من حيث الأنواع، ونقاط زمنية (time_point)، ومدد زمنية (duration). في C++20، تم توسيع المكتبة لدعم أنواع التقويم (السنة، الشهر، اليوم) والمناطق الزمنية.



المكونات الرئيسية:

  • std::chrono::system_clock — ساعة النظام، المرتبطة بالوقت الحقيقي.
  • std::chrono::steady_clock — ساعة رتيبة لقياس الفترات الزمنية.
  • std::chrono::duration — الفاصل الزمني (مثل الثواني، الميلي ثانية).
  • std::chrono::time_point — نقطة زمنية.
  • أنواع التقويم (C++20): year_month_day، hh_mm_ss وغيرها.


#include <iostream>#include <chrono>#include <format> // C++20

int main() { using namespace std::chrono;

// الوقت الحالي auto now = system_clock::now(); std::cout << "الوقت الحالي: " << now << "";

// التحويل إلى تاريخ تقويمي (C++20) auto dp = floor<days>(now); year_month_day ymd{dp}; std::cout << "السنة: " << (int)ymd.year() << "";

// قياس الفاصل الزمني auto start = steady_clock::now(); // ... بعض الكود ... auto end = steady_clock::now(); auto diff = end - start; std::cout << "مضى: " << duration_cast<milliseconds>(diff).count() << " مللي ثانية"; return 0;}


المزايا: مدمجة في المعيار، آمنة من حيث الأنواع، تتطور بنشاط.

العيوب: بالنسبة لـ C++20، يلزم وجود مترجم حديث (GCC 12+، Clang 14+، MSVC 2022).



2. Boost.DateTime



مكتبة Boost.DateTime هي واحدة من أقدم وأكثر المكتبات نضجًا للعمل مع التواريخ. قبل ظهور C++20، كانت المعيار الفعلي. توفر الفئات boost::gregorian::date، boost::posix_time::ptime ودعمًا كاملاً للمناطق الزمنية.



الإمكانيات الرئيسية:

  • التقويم الميلادي مع دعم السنوات الكبيسة.
  • التلاعب بالتواريخ: إضافة أيام، أشهر، سنوات.
  • التنسيق والتحليل عبر boost::date_time::date_facet.
  • دعم المناطق الزمنية عبر boost::local_time.


#include <iostream>#include <boost/date_time/gregorian/gregorian.hpp>#include <boost/date_time/posix_time/posix_time.hpp>

int main() { using namespace boost::gregorian; using namespace boost::posix_time;

// إنشاء تاريخ date d(2024, 12, 25); std::cout << "التاريخ: " << d << ""; // 2024-Dec-25

// إضافة أيام date next_week = d + days(7); std::cout << "بعد أسبوع: " << next_week << "";

// الفرق بين التواريخ days diff = next_week - d; std::cout << "الفرق: " << diff.days() << " أيام";

// الوقت الحالي بدقة الثواني ptime now = second_clock::local_time(); std::cout << "الآن: " << now << ""; return 0;}


المزايا: مجربة عبر الزمن، توثيق شامل، تعمل مع C++98.

\

توصيات