العمل مع التواريخ والوقت في C++: دليل شامل لـ chrono

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

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

ابدأ الدورة

العمل مع التواريخ والوقت في C++: من <ctime> إلى <chrono> الحديثة



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



1. الطريقة الكلاسيكية: <ctime> و std::time_t



قبل C++11، كانت الطريقة القياسية الوحيدة للعمل مع الوقت هي دوال من C: time()، localtime()، strftime(). لا يزال هذا النهج مستخدماً في الكود القديم والمهام البسيطة.



الحصول على الوقت الحالي

الدالة std::time(nullptr) تُرجع عدد الثواني منذ 1 يناير 1970 (عصر Unix) كعدد صحيح من النوع std::time_t.



#include <iostream>#include <ctime>

int main() { std::time_t now = std::time(nullptr); std::cout << "الوقت الحالي (ثوانٍ منذ العصر): " << now << std::endl; return 0;}


التحويل إلى تنسيق قابل للقراءة

للحصول على هيكل بالمكونات (السنة، الشهر، اليوم، الساعات، إلخ)، استخدم std::localtime() أو std::gmtime().



#include <iostream>#include <ctime>

int main() { std::time_t now = std::time(nullptr); std::tm* local = std::localtime(&now);

std::cout << "السنة: " << (local->tm_year + 1900) << std::endl; std::cout << "الشهر: " << (local->tm_mon + 1) << std::endl; std::cout << "اليوم: " << local->tm_mday << std::endl; return 0;}


تنسيق السلسلة النصية باستخدام strftime

الدالة std::strftime() تسمح بتنسيق التاريخ بمرونة إلى سلسلة نصية وفقاً لنمط معين.



#include <iostream>#include <ctime>

int main() { std::time_t now = std::time(nullptr); std::tm* local = std::localtime(&now);

char buffer[80]; std::strftime(buffer, sizeof(buffer), "%d.%m.%Y %H:%M:%S", local); std::cout << "التاريخ والوقت الحاليان: " << buffer << std::endl; return 0;}


⚠️ مهم: std::localtime() و std::gmtime() تُرجعان مؤشراً إلى مخزن مؤقت ثابت — وهذا غير آمن للخيوط. في C++11، ظهرت إصدارات قابلة لإعادة الدخول localtime_s (Windows) أو localtime_r (POSIX).



2. C++ الحديثة: مكتبة <chrono>



تقدم مكتبة <chrono> كتابة صارمة للأنواع، والعمل مع وحدات زمنية مختلفة، ودقة عالية. المكونات الأساسية:

  • الساعات (clocks): system_clock، steady_clock، high_resolution_clock
  • لحظات الزمن (time_point): ربط بلحظة محددة
  • المدد (duration): الفترات الزمنية (ثوانٍ، ملي ثانية، إلخ)


الحصول على اللحظة الحالية

#include <iostream>#include <chrono>#include <ctime> // لـ std::time_t

int main() { auto now = std::chrono::system_clock::now(); std::time_t now_time = std::chrono::system_clock::to_time_t(now); std::cout << "الوقت الحالي: " << std::ctime(&now_time); return 0;}


قياس الفترات الزمنية (مؤقت)

إحدى المهام الأكثر شيوعاً هي قياس وقت تنفيذ الكود. لهذا، يعتبر

المدونات

توصيات الكتب