العمل مع التواريخ في C++: مكتبات chrono و date.h و Boost.DateTime

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

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

ابدأ الدورة

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



العمل مع التواريخ والوقت هي إحدى المهام الأساسية في تطوير البرمجيات. في لغة C++، لم تكن هناك أدوات قياسية ملائمة لفترة طويلة، مما أدى إلى استخدام دوال C (ctime, localtime) أو حلول خارجية. لكن مع ظهور المعيار C++11 والإصدارات اللاحقة، تغير الوضع جذريًا. في هذه المقالة، سنستعرض ثلاثة مناهج رئيسية للعمل مع التواريخ في C++: المكتبة القياسية std::chrono، والإضافة date.h من هوارد هينانت (Howard Hinnant)، وإطار العمل القوي Boost.DateTime.



1. المكتبة القياسية std::chrono (C++11 وما بعده)



std::chrono هي جزء من المكتبة القياسية لـ C++، وتوفر أنواعًا لتمثيل النقاط الزمنية (time_point)، والمدد الزمنية (duration)، والساعات (clock). وهي مثالية لقياس الفترات الزمنية، والعمل مع المؤقتات، والتأخيرات عالية الدقة. ومع ذلك، حتى C++20، لم تكن تحتوي على أدوات ملائمة للعمل مع التواريخ التقويمية (اليوم، الشهر، السنة).



مثال: قياس وقت تنفيذ الكود

#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، ظهر دعم التقويم في std::chrono: الأنواع year، month، day، year_month_day وعوامل التشغيل للتعامل معها. الآن يمكنك كتابة:

#include <chrono>#include <iostream>

int main() { using namespace std::chrono; auto today = floor<days>(system_clock::now()); year_month_day ymd{today}; std::cout << int(ymd.year()) << "-" << unsigned(ymd.month()) << "-" << unsigned(ymd.day()) << ""; return 0;}


2. مكتبة date.h (هوارد هينانت)



قبل إصدار C++20، استخدم المطورون بنشاط مكتبة date.h - وهي إضافة من ملف واحد لـ std::chrono، كتبها هوارد هينانت. توفر مجموعة كاملة من الوظائف للعمل مع التواريخ: التحليل، التنسيق، حساب الفرق بين التواريخ، العمل مع المناطق الزمنية، وحتى دعم التقويم اليولياني.



مثال: تحليل سلسلة نصية إلى تاريخ

#include "date.h"#include <iostream>#include <sstream>

int main() { std::istringstream ss("2025-04-07"); date::sys_days tp; ss >> date::parse("%F", tp); // تنسيق ISO 8601 auto ymd = date::year_month_day{tp}; std::cout << "السنة: " << int(ymd.year()) << ""; return 0;}


مثال: حساب العمر

#include "date.h"#include <iostream>

int main() { using namespace date; auto birth = sys_days{year{1990}/month{1}/day{15}}; auto today = floor<days>(std::chrono::system_clock::now()); auto age = today - birth; std::cout << "العمر بالأيام: " << age.count() << ""; // العمر بالسنوات (تقريبًا) auto years = duration_cast<std::chrono::years>(age); std::cout << "العمر بالسنوات: " << years.count() << ""; return 0;}


مكتبة date.h سهلة الإضافة (يكفي نسخ ملف الرأس) ولا تتطلب بناء. أصبحت أساسًا لـ std::chrono القياسي في C++2

توصيات