C++ Academy · درس

التقويم والمناطق الزمنية

استخدم أنواع التقويم في C++20

الدرس 4 من 413 خطوة

التقويم والمناطق الزمنية درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

أنواع التقويم في C++20

أضافت C++20 دعمًا متقدمًا لـالتقويم في <chrono>. يمكنك الآن التعبير عن السنوات والأشهر والأيام مباشرةً باستخدام أنواع، بدلًا من التعامل مع أعداد صحيحة بصورة متفرقة.

  • year وmonth وday
  • year_month_day لتمثيل تاريخ كامل
#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    year y{2026};
    std::cout << "Year value: " << static_cast<int>(y) << '\n';
    return 0;
}

ثوابت التقويم

تجعل ثوابت التقويم مثل 2026y و15d، إلى جانب الأشهر المسماة مثل std::chrono::May، قراءة التواريخ طبيعية.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto y = 2026y;
    auto d = 15d;
    std::cout << static_cast<int>(y) << " / " << static_cast<unsigned>(d) << '\n';
    return 0;
}

إنشاء تاريخ

اجمع الأجزاء الثلاثة باستخدام المعامل / لتكوين year_month_day. ويُقرأ الترتيب على النحو التالي: السنة، ثم الشهر، ثم اليوم.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    year_month_day ymd = 2026y/May/30;
    std::cout << static_cast<int>(ymd.year()) << "-"
              << static_cast<unsigned>(ymd.month()) << "-"
              << static_cast<unsigned>(ymd.day()) << '\n';
    return 0;
}

التحقق من صحة التواريخ

يعرف year_month_day ما إذا كان يمثل تاريخًا تقويميًا حقيقيًا. استخدم ok() لرفض القيم غير الممكنة مثل 30 فبراير.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    year_month_day good = 2026y/February/28;
    year_month_day bad = 2026y/February/30;
    std::cout << std::boolalpha << good.ok() << " " << bad.ok() << '\n';
    return 0;
}

sys_days

حوّل التاريخ إلى sys_days، وهو عدد الأيام منذ البداية الزمنية. يتيح لك ذلك إجراء عمليات حسابية على الأيام وحساب الفروق بين التواريخ.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    sys_days a = sys_days{2026y/May/30};
    sys_days b = sys_days{2026y/May/20};
    std::cout << "Days apart: " << (a - b).count() << '\n';
    return 0;
}

العمليات الحسابية على الأيام

تؤدي إضافة days{n} إلى قيمة من نوع sys_days إلى التقدم بمقدار n يومًا، وبعد ذلك يمكنك التحويل مجددًا إلى تاريخ تقويمي.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    sys_days start = sys_days{2026y/May/30};
    sys_days later = start + days{10};
    year_month_day ymd = later;
    std::cout << static_cast<unsigned>(ymd.day()) << "/"
              << static_cast<unsigned>(ymd.month()) << '\n';
    return 0;
}

يوم الأسبوع

حوّل قيمة من نوع sys_days إلى weekday لمعرفة يوم الأسبوع الذي يقع فيه التاريخ.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    weekday wd{sys_days{2026y/May/30}};
    std::cout << "Weekday index (Sun=0): " << wd.c_encoding() << '\n';
    return 0;
}

اليوم الأخير من الشهر

يحسب الوسم الخاص last اليوم الأخير من أي شهر، مع التعامل تلقائيًا مع السنوات الكبيسة.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    year_month_day_last eom = 2024y/February/last;
    year_month_day ymd = eom;
    std::cout << "Feb 2024 ends on day " << static_cast<unsigned>(ymd.day()) << '\n';
    return 0;
}

التحقق من السنة الكبيسة

يوفّر النوع year الدالة is_leap()، لذلك لا يتعين عليك تذكّر قواعد القابلية للقسمة بنفسك.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    std::cout << std::boolalpha;
    std::cout << "2024 leap: " << year{2024}.is_leap() << '\n';
    std::cout << "2026 leap: " << year{2026}.is_leap() << '\n';
    return 0;
}

من نقطة زمنية إلى تاريخ

قرّب نقطة زمنية من system_clock إلى days، ثم حوّلها إلى year_month_day للحصول على تاريخ اليوم التقويمي.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto today = floor<days>(system_clock::now());
    year_month_day ymd = sys_days{today};
    std::cout << "Year is in range: " << (static_cast<int>(ymd.year()) > 2000) << '\n';
    return 0;
}

المناطق الزمنية

تضيف C++20 أيضًا دعم المناطق الزمنية من خلال std::chrono::zoned_time وقاعدة بيانات IANA. ويعتمد توفر ذلك على مكتبة المعايير المستخدمة، لكن هذا النموذج يربط نقطة زمنية بمنطقة مسماة لعرض الوقت المحلي بصورة صحيحة.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto now = system_clock::now();
    auto days_part = floor<days>(now);
    std::cout << "Have a UTC time point: " << (days_part.time_since_epoch().count() > 0) << '\n';
    return 0;
}

تحقق سريع

اختبر مدى فهمك لأنواع التقويم في C++20.

مراجعة

تعلّمت دعم التقويم في C++20:

  • الأنواع year وmonth وday وyear_month_day مع منشئ /
  • التحقق باستخدام ok() وفحص السنوات الكبيسة باستخدام is_leap()
  • استخدام sys_days لإجراء العمليات الحسابية على الأيام ومعرفة يوم الأسبوع
  • استخدام last لتحديد نهاية الشهر، إضافةً إلى مقدمة عن zoned_time

بهذا تكتمل دورة الوقت ومكتبة Chrono.

البدء مجانًا

تعلم C++ مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

الأسئلة الشائعة

هل درس «التقويم والمناطق الزمنية» مجاني؟

نعم — نص درس «التقويم والمناطق الزمنية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «التقويم والمناطق الزمنية»؟

استخدم أنواع التقويم في C++20 تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «التقويم والمناطق الزمنية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. المدد والساعات
  2. النقاط الزمنية
  3. قياس أداء التعليمات البرمجية
  4. التقويم والمناطق الزمنية
← العودة إلى C++ Academy