العمل مع التواريخ والوقت في 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;}قياس الفترات الزمنية (مؤقت)
إحدى المهام الأكثر شيوعاً هي قياس وقت تنفيذ الكود. لهذا، يعتبر