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