مقدمة: لماذا أصبح العمل القياسي مع الوقت في C++ أكثر تعقيدًا (وأفضل)
لفترة طويلة، كان العمل مع التواريخ والأوقات في C++ يقتصر على استخدام الدوال من <ctime>: time() و localtime() و strftime(). كان هذا كافيًا للمهام البسيطة، ولكن مع تزايد تعقيد المشاريع (الأنظمة الموزعة، الخوادم عالية التحميل، التطبيقات المالية)، أصبحت هناك حاجة لأدوات أكثر دقة وأمانًا وسهولة في الاستخدام.
قدم لنا معيار C++11 مكتبة <chrono>، التي تحل مشاكل التجاوز والارتباك في وحدات القياس والاعتماد على المنصة. وقد خطا C++20 خطوة مهمة إلى الأمام بإضافة دعم المناطق الزمنية وأنواع التقويم والتنسيق عبر std::format. في هذه المقالة، سنستعرض تقنيات متقدمة تتجاوز مجرد الحصول على الوقت الحالي.
1. مكتبة chrono: من الميلي ثانية إلى النانو ثانية والتقاويم
جوهر std::chrono هو ثلاثة مكونات: الساعة (clock) و المدة (duration) و نقطة الزمن (time_point). على المستوى المتقدم، من المهم معرفة كيفية اختيار الساعة المناسبة والعمل مع العمليات الحسابية للوقت.
1.1. اختيار الساعات: system_clock و steady_clock و high_resolution_clock
system_clock— تمثل وقت النظام (التقويمي). يمكن تعديلها من قبل المستخدم أو خدمة المزامنة (NTP). تُستخدم لعرض التاريخ للمستخدم.steady_clock— ساعة رتيبة. لا يتم تعديلها أبدًا إلى الوراء (no rollback). مثالية لقياس الفترات الزمنية (المؤقتات، التنميط).high_resolution_clock— الساعة ذات أصغر نبضة ممكنة. في معظم المنصات، هي مرادف لـsteady_clock.
نصيحة متقدمة: لا تستخدم أبدًا high_resolution_clock للتنميط إذا كنت بحاجة إلى الاستقرار. استخدم steady_clock.
1.2. العمل مع duration و time_point
العمل المتقدم لا يعني فقط قياس الوقت، بل التحويل بين الوحدات، والعمليات الحسابية، والأنواع المخصصة.
#include <iostream>#include <chrono>#include <thread>
int main() { using namespace std::chrono_literals; // للواحق ms, s, us
// إنشاء مدة متقدم auto work_time = 2h + 30min + 15s; // ساعتان و30 دقيقة و15 ثانية std::cout << "وقت العمل بالثواني: " << work_time.count() << " ثانية";
// التحويل مع التقريب (duration_cast) auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(work_time); std::cout << "بالميلي ثانية: " << ms.count() << " مللي ثانية";
// قياس وقت تنفيذ دالة auto start = std::chrono::steady_clock::now(); std::this_thread::sleep_for(100ms); // محاكاة عمل auto end = std::chrono::steady_clock::now(); auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start); std::cout << "استغرقت الدالة: " << elapsed.count() << " ميكرو ثانية";
return 0;}1.3. أنواع التقويم (C++20)
أضاف C++20 year_month_day و year_month و weekday وغيرها. وهذا يسمح بالتلاعب الآمن بالتواريخ دون العمل مع الأرقام الأولية.
#include <iostream>#include <chrono>
int main() { using namespace std::chrono;
// إنشاء تاريخ auto date = 2023y / October / 15d; // 15 أكتوبر 2023 std::cout << "التاريخ: " << date << '';
// إضافة أيام auto next_week = date + days(7); std::cout << "بعد أسبوع: " << next_week << '';
// الحصول على يوم الأسبوع weekday wd{date}; std::cout <&l