العمل المتقدم مع التواريخ والأوقات في C++: chrono و time_t وتحليل السلاسل النصية

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

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

ابدأ الدورة

مقدمة: لماذا أصبح العمل القياسي مع الوقت في 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

المدونات

توصيات الكتب