التعامل مع التواريخ والأوقات في C++: من الألف إلى الياء — دليل شامل

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

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

ابدأ الدورة

التعامل مع التواريخ والأوقات في C++: من الألف إلى الياء

\n\n

التعامل مع التواريخ والأوقات هو أحد المهام الأساسية في البرمجة. إنه مطلوب في كل مكان: من تسجيل الأحداث إلى حساب المواعيد النهائية وإنشاء الرسوم البيانية. في C++، كانت هذه المنطقة تاريخياً ليست الأكثر ملاءمة، ولكن مع ظهور معيار C++11 والإصدارات اللاحقة (C++14، C++17، C++20) تغير الوضع جذرياً. في هذه المقالة، سنغطي جميع الجوانب الرئيسية: من دوال C الكلاسيكية إلى مكتبة chrono الحديثة، والمؤقتات، والتنسيق، والتحليل. ستكون المادة مفيدة لكل من المبتدئين والمطورين ذوي الخبرة الذين يرغبون في تنظيم معرفتهم.

\n\n

1. النهج الكلاسيكي: time_t وهيكل tm

\n\n

قبل ظهور chrono، كانت الأدوات الرئيسية هي الدوال من <ctime>. لا يزال هذا النهج مناسباً لدعم الكود القديم والمهام البسيطة.

\n\n

الدوال الرئيسية:

\n
    \n
  • time() — تعيد الوقت الحالي كـ time_t (عدد الثواني منذ 1 يناير 1970).
  • \n
  • localtime() — تحول time_t إلى هيكل tm (الوقت المحلي).
  • \n
  • gmtime() — تحول إلى UTC.
  • \n
  • strftime() — تنسيق tm إلى سلسلة نصية.
  • \n
  • mktime() — التحويل العكسي: tm → time_t.
  • \n
\n\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
\n\n

2. C++ الحديثة: مكتبة chrono (C++11 وما بعده)

\n\n

مكتبة chrono هي أداة قوية وآمنة من حيث النوع للتعامل مع الوقت. إنها تشكل أساس جميع مشاريع C++ الحديثة.

\n\n

المكونات الرئيسية:

\n
    \n
  • الساعات (clocks): system_clock (وقت النظام)، steady_clock (ساعة رتيبة للقياسات)، high_resolution_clock (أقصى دقة).
  • \n
  • لحظات الوقت (time_point): مرتبطة بساعات محددة.
  • \n
  • المدد (duration): فترات زمنية (ثوانٍ، ميلي ثانية، نانو ثانية).
  • \n
\n\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
  • دعم العمليات الحسابية (الجمع/الطرح

المدونات

توصيات الكتب