العمل المتقدم مع التواريخ والوقت في C++: من chrono إلى المناطق الزمنية
\n\nالعمل مع التواريخ والوقت هي إحدى المهام الرئيسية عند تطوير الأنظمة عالية التحميل، وتسجيل الأحداث، والتطبيقات المالية، والمجدولين. في C++، تقدم المكتبة القياسية مجموعة أدوات قوية، بدءًا من time_t البسيطة وصولاً إلى <chrono> الحديثة. في هذه المقالة، سنستعرض التقنيات المتقدمة: القياسات الدقيقة، المناطق الزمنية، التنسيق، وحساب الفترات الزمنية.
1. مكتبة chrono: duration و time_point و clocks
\n\nتوفر المكتبة القياسية <chrono> (C++11 وما بعده) أنواعًا لتمثيل لحظات الوقت (time_point)، والمدد الزمنية (duration)، والساعات (clock). وهذا يسمح بكتابة كود مستقل عن المنصة.
#include <iostream>\n#include <chrono>\n#include <thread>\n\nint main() {\n using namespace std::chrono;\n\n // تسجيل وقت البداية\n auto start = high_resolution_clock::now();\n\n // محاكاة عمل\n std::this_thread::sleep_for(milliseconds(500));\n\n auto end = high_resolution_clock::now();\n\n // حساب المدة\n auto duration = duration_cast<milliseconds>(end - start);\n std::cout << "المدة المنقضية: " << duration.count() << " مللي ثانية\\n";\n\n // العمل مع duration بوحدات مختلفة\n seconds sec(1);\n milliseconds ms = sec; // تحويل ضمني (بدون فقدان)\n // milliseconds ms2 = duration_cast<milliseconds>(sec); // صريح\n std::cout << "1 ثانية = " << ms.count() << " مللي ثانية\\n";\n\n return 0;\n}\n\nالنقاط الرئيسية:
\n- \n
duration_cast— التحويل بين الوحدات (قد يفقد الدقة). \n high_resolution_clock— الساعة الأكثر دقة (عادةً ما تكون غلافًا لمؤقت النظام). \n system_clock— وقت النظام، مرتبط بالتقويم. \n steady_clock— ساعة رتيبة، مثالية لقياس الفترات الزمنية. \n
2. وقت النظام والتحويل إلى تواريخ تقويمية
\n\nللعمل مع التواريخ التقويمية (السنة، الشهر، اليوم)، استخدم system_clock والدوال to_time_t / from_time_t. بدءًا من C++20، ظهرت أدوات أكثر ملاءمة، لكننا سنستعرض الطريقة التقليدية.
#include <iostream>\n#include <chrono>\n#include <ctime>\n\nint main() {\n using namespace std::chrono;\n\n // وقت النظام الحالي\n auto now = system_clock::now();\n std::time_t now_c = system_clock::to_time_t(now);\n\n // تحويل إلى الوقت المحلي\n std::tm* local = std::localtime(&now_c);\n std::cout << "الوقت المحلي: " \n << std::put_time(local, "%Y-%m-%d %H:%M:%S") << "\\n";\n\n // إنشاء time_point من تاريخ تقويمي (C++20 سيبسط الأمر)\n std::tm date = {};\n date.tm_year = 2025 - 1900; // السنوات من 1900\n date.tm_mon = 3; // أبريل (0-11)\n date.tm_mday = 15;\n date.tm_hour = 12;\n date.tm_min = 30;\n date.tm_sec = 0;\n std::time_t date_c = std::mktime(&date);\n auto date_point = system_clock::from_time_t(date_c);\n\n // الفرق بالأيام\n auto diff = duration_cast<hours>(now - date_point).count() / 24;\n std::cout << "عدد الأيام منذ 15.04.2025: " << diff << "\\n";\n\n return 0;\n}\n\nهام: std::put_time متاح منذ C++11. محددات التنسيق مشابهة لـ strftime.
3. المناطق الزمنية و C++20
\n\nقبل C++20، كان العمل مع المناطق الزمنية غير بديهي. في C++20، ظهرت مكتبة <chrono> مع دعم time_zone و zoned_time. إذا كان المترجم الخاص بك يدعم C++20 (GCC 12+، Clang 15+، MSVC 2022 17.4+)، يمكنك استخدام