التعامل مع التواريخ والأوقات في C++: من الألف إلى الياء
\n\nالتعامل مع التواريخ والأوقات هو أحد المهام الأساسية في البرمجة. إنه مطلوب في كل مكان: من تسجيل الأحداث إلى حساب المواعيد النهائية وإنشاء الرسوم البيانية. في C++، كانت هذه المنطقة تاريخياً ليست الأكثر ملاءمة، ولكن مع ظهور معيار C++11 والإصدارات اللاحقة (C++14، C++17، C++20) تغير الوضع جذرياً. في هذه المقالة، سنغطي جميع الجوانب الرئيسية: من دوال C الكلاسيكية إلى مكتبة chrono الحديثة، والمؤقتات، والتنسيق، والتحليل. ستكون المادة مفيدة لكل من المبتدئين والمطورين ذوي الخبرة الذين يرغبون في تنظيم معرفتهم.
1. النهج الكلاسيكي: time_t وهيكل tm
\n\nقبل ظهور chrono، كانت الأدوات الرئيسية هي الدوال من <ctime>. لا يزال هذا النهج مناسباً لدعم الكود القديم والمهام البسيطة.
الدوال الرئيسية:
\n- \n
time()— تعيد الوقت الحالي كـtime_t(عدد الثواني منذ 1 يناير 1970). \n localtime()— تحولtime_tإلى هيكلtm(الوقت المحلي). \n gmtime()— تحول إلى UTC. \n strftime()— تنسيقtmإلى سلسلة نصية. \n mktime()— التحويل العكسي:tm→time_t. \n
#include <iostream>\n#include <ctime>\n\nint main() {\n // الحصول على الوقت الحالي\n std::time_t now = std::time(nullptr);\n\n // التحويل إلى الوقت المحلي\n std::tm* local_tm = std::localtime(&now);\n\n // التنسيق إلى سلسلة نصية\n char buffer[80];\n std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_tm);\n\n std::cout << "الوقت الحالي: " << buffer << std::endl;\n return 0;\n}\n\nعيوب النهج:
\n- \n
- يعمل فقط مع الثواني (الميلي ثانية والميكروثانية غير متوفرة). \n
- غير آمن في البيئات متعددة الخيوط (استخدم
localtime_rفي POSIX). \n - هيكل
tmيحتوي على حقول يمكن الخلط بينها بسهولة (السنة منزاحة بمقدار 1900، الأشهر تبدأ من 0). \n - لا يوجد دعم للمناطق الزمنية وفترات الوقت. \n
2. C++ الحديثة: مكتبة chrono (C++11 وما بعده)
\n\nمكتبة chrono هي أداة قوية وآمنة من حيث النوع للتعامل مع الوقت. إنها تشكل أساس جميع مشاريع C++ الحديثة.
المكونات الرئيسية:
\n- \n
- الساعات (clocks):
system_clock(وقت النظام)،steady_clock(ساعة رتيبة للقياسات)،high_resolution_clock(أقصى دقة). \n - لحظات الوقت (time_point): مرتبطة بساعات محددة. \n
- المدد (duration): فترات زمنية (ثوانٍ، ميلي ثانية، نانو ثانية). \n
#include <iostream>\n#include <chrono>\n#include <thread>\n\nint main() {\n using namespace std::chrono;\n\n // اللحظة الزمنية الحالية\n auto now = system_clock::now();\n\n // التحويل إلى time_t للعرض\n std::time_t now_c = system_clock::to_time_t(now);\n std::cout << "الوقت الحالي: " << std::ctime(&now_c);\n\n // قياس وقت التنفيذ\n auto start = steady_clock::now();\n std::this_thread::sleep_for(milliseconds(500)); // محاكاة عمل\n auto end = steady_clock::now();\n\n auto duration = duration_cast<milliseconds>(end - start);\n std::cout << "مضى: " << duration.count() << " مللي ثانية" << std::endl;\n\n return 0;\n}\n\nمزايا chrono:
\n- \n
- دقة عالية (نانو ثانية). \n
- أمان من حيث النوع (لا يمكن جمع الثواني مع الميلي ثانية عن طريق الخطأ). \n
- دعم العمليات الحسابية (الجمع/الطرح