النقاط الزمنية
مثّل اللحظات الزمنية
النقاط الزمنية درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
ما المقصود بالنقطة الزمنية؟
تمثّل std::chrono::time_point لحظة محددة مقيسة انطلاقًا من حقبة الساعة. وهي تربط ساعة بمدة منذ تلك الحقبة.
- تعيدها
clock::now(). - يؤدي طرح نقطتين زمنيتين إلى الحصول على مدة.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
time_point<steady_clock> tp = steady_clock::now();
std::cout << "Captured a moment: " << (tp.time_since_epoch().count() != 0) << '\n';
return 0;
}time_since_epoch
يمكن لكل نقطة زمنية الإبلاغ عن المسافة بينها وبين حقبة الساعة باستخدام time_since_epoch()، الذي يعيد مدة.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
auto d = tp.time_since_epoch();
auto s = duration_cast<seconds>(d);
std::cout << "Positive epoch seconds: " << (s.count() > 0) << '\n';
return 0;
}طرح النقاط الزمنية
يؤدي طرح نقطة زمنية من أخرى إلى الحصول على مدة تمثل الوقت المنقضي بين اللحظتين.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto a = steady_clock::now();
auto b = steady_clock::now();
auto diff = b - a;
std::cout << "Elapsed ns is non-negative: " << (diff.count() >= 0) << '\n';
return 0;
}إضافة مدة
تنتج عن إضافة مدة إلى نقطة زمنية نقطة زمنية جديدة في المستقبل، أو في الماضي عند الطرح. وهذه هي الطريقة التي تحسب بها المواعيد النهائية.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
using namespace std::chrono_literals;
auto now = steady_clock::now();
auto deadline = now + 10s;
std::cout << "Deadline is after now: " << std::boolalpha << (deadline > now) << '\n';
return 0;
}مقارنة النقاط الزمنية
تدعم النقاط الزمنية المنتمية إلى الساعة نفسها جميع معاملات المقارنة، مما يتيح لك التحقق مما إذا كانت إحدى اللحظتين تسبق الأخرى أو تليها.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto first = steady_clock::now();
auto second = steady_clock::now();
std::cout << std::boolalpha << (first <= second) << '\n';
return 0;
}نقاط زمنية خاصة بكل ساعة
ترتبط النقطة الزمنية بنوع ساعتها. ولا يمكنك مقارنة نقطة زمنية من system_clock مباشرةً بنقطة من steady_clock، لأن حقبتيهما مختلفتان.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
system_clock::time_point sys = system_clock::now();
steady_clock::time_point mono = steady_clock::now();
std::cout << "Both captured: " << ((sys.time_since_epoch().count() != 0) && (mono.time_since_epoch().count() != 0)) << '\n';
return 0;
}التحويل إلى time_t
تحوّل system_clock::to_time_t نقطة زمنية تقويمية إلى time_t بنمط C، ويمكنك تنسيقها لعرضها للإنسان.
#include <iostream>
#include <chrono>
#include <ctime>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
std::time_t t = system_clock::to_time_t(tp);
std::cout << "time_t is positive: " << (t > 0) << '\n';
return 0;
}from_time_t
أما العملية العكسية، system_clock::from_time_t، فتنشئ نقطة زمنية من قيمة time_t، مثل طابع زمني مخزّن.
#include <iostream>
#include <chrono>
#include <ctime>
int main() {
using namespace std::chrono;
std::time_t t = 1000000000;
auto tp = system_clock::from_time_t(t);
auto back = system_clock::to_time_t(tp);
std::cout << "Round trip ok: " << std::boolalpha << (back == t) << '\n';
return 0;
}حساب موعد نهائي
من الأنماط الشائعة: التقط قيمة now()، وأضف مدة مهلة، ثم قارنها لاحقًا بقيمة now() جديدة لمعرفة ما إذا كان الموعد النهائي قد انقضى.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
using namespace std::chrono_literals;
auto deadline = steady_clock::now() + 0ms;
auto current = steady_clock::now();
bool expired = current >= deadline;
std::cout << "Expired: " << std::boolalpha << expired << '\n';
return 0;
}دقة النقاط الزمنية
تطابق دقة النقطة الزمنية نوع مدة ساعتِها. ويمكنك تحويل نقطة زمنية إلى وحدة أخشن باستخدام time_point_cast.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
auto secs_tp = time_point_cast<seconds>(tp);
std::cout << "Cast preserved sign: " << (secs_tp.time_since_epoch().count() > 0) << '\n';
return 0;
}تخزين الطوابع الزمنية
لحفظ لحظة زمنية، حوّلها إلى عدد الثواني منذ الحقبة، وخزّن العدد الصحيح، ثم أعد إنشاء النقطة الزمنية لاحقًا عند الحاجة.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
long long stored = duration_cast<seconds>(tp.time_since_epoch()).count();
std::cout << "Stored value usable: " << (stored > 0) << '\n';
return 0;
}تحقق سريع
اختبر مدى فهمك للعمليات الحسابية على النقاط الزمنية.
مراجعة
تعلّمت أن time_point:
- تحدّد لحظة محددة بالنسبة إلى حقبة الساعة
- تُبلغ عن إزاحتها باستخدام
time_since_epoch() - تدعم إضافة المدد وطرحها، بالإضافة إلى المقارنات
- تتحول من وإلى
time_tللعرض والتخزين
بعد ذلك، ستستخدم هذه الأدوات لقياس أداء الشيفرة واختباره.
الأسئلة الشائعة
هل درس «النقاط الزمنية» مجاني؟
نعم — نص درس «النقاط الزمنية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «النقاط الزمنية»؟
مثّل اللحظات الزمنية تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «النقاط الزمنية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.