العمل مع التواريخ والوقت في C++: المستوى المتقدم

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

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

ابدأ الدورة

العمل المتقدم مع التواريخ والوقت في C++: من chrono إلى المناطق الزمنية

\n\n

العمل مع التواريخ والوقت هي إحدى المهام الرئيسية عند تطوير الأنظمة عالية التحميل، وتسجيل الأحداث، والتطبيقات المالية، والمجدولين. في C++، تقدم المكتبة القياسية مجموعة أدوات قوية، بدءًا من time_t البسيطة وصولاً إلى <chrono> الحديثة. في هذه المقالة، سنستعرض التقنيات المتقدمة: القياسات الدقيقة، المناطق الزمنية، التنسيق، وحساب الفترات الزمنية.

\n\n

1. مكتبة chrono: duration و time_point و clocks

\n\n

توفر المكتبة القياسية <chrono> (C++11 وما بعده) أنواعًا لتمثيل لحظات الوقت (time_point)، والمدد الزمنية (duration)، والساعات (clock). وهذا يسمح بكتابة كود مستقل عن المنصة.

\n\n
#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
\n\n

2. وقت النظام والتحويل إلى تواريخ تقويمية

\n\n

للعمل مع التواريخ التقويمية (السنة، الشهر، اليوم)، استخدم system_clock والدوال to_time_t / from_time_t. بدءًا من C++20، ظهرت أدوات أكثر ملاءمة، لكننا سنستعرض الطريقة التقليدية.

\n\n
#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.

\n\n

3. المناطق الزمنية و C++20

\n\n

قبل C++20، كان العمل مع المناطق الزمنية غير بديهي. في C++20، ظهرت مكتبة <chrono> مع دعم time_zone و zoned_time. إذا كان المترجم الخاص بك يدعم C++20 (GCC 12+، Clang 15+، MSVC 2022 17.4+)، يمكنك استخدام

المدونات

توصيات الكتب