التواريخ والأوقات

التعامل مع التواريخ والأوقات هو واحد من أكثر المهام شيوعاً في البرمجة — تسجيل الطوابع الزمنية للسجلات، حساب أيام الاستعارة، تجميع البيانات عبر الفترات الزمنية... وحدة datetime هي الطريقة القياسية لبايثون للعمل مع التواريخ والأوقات.


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

PYTHON
from datetime import datetime, date, time

# الوقت والتاريخ الحاليان
now = datetime.now()
print(now)                      # 2026-06-23 16:00:00.123456

# التاريخ الحالي
today = date.today()
print(today)                    # 2026-06-23

# أنشئ تاريخاً محدداً
d = datetime(2026, 6, 23, 15, 30, 0)
print(d)                        # 2026-06-23 15:30:00

مثال: تذكير عيد الميلاد (الصعوبة ⭐)

PYTHON
from datetime import datetime

def days_to_birthday(birth_str):
    """احسب الأيام حتى عيد الميلاد القادم"""
    today = datetime.now()
    birth = datetime.strptime(birth_str, "%m-%d")
    birthday_this_year = birth.replace(year=today.year)

    if birthday_this_year < today:
        birthday_this_year = birthday_this_year.replace(year=today.year + 1)

    delta = birthday_this_year - today
    return delta.days

print(f"Days until next birthday: {days_to_birthday('12-25')}")
▶ جرّب الكود

2. التنسيق والتحليل

PYTHON
from datetime import datetime

# تاريخ -> سلسلة (تنسيق)
now = datetime.now()
print(now.strftime("%Y-%m-%d"))              # 2026-06-23
print(now.strftime("%H:%M:%S"))              # 16:00:00
print(now.strftime("%A"))                    # Tuesday

# سلسلة -> تاريخ (تحليل)
date_str = "2026-06-23 15:30:00"
parsed = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(parsed)                                # 2026-06-23 15:30:00
رمز التنسيق المعنى مثال
%Y السنة بأربع خانات 2026
%m الشهر برقمين 06
%d اليوم برقمين 23
%H الساعة (24 ساعة) 15
%M الدقيقة 30
%S الثانية 00
%A اسم اليوم الكامل Tuesday
💡 strftime هي "تاريخ ← سلسلة"، strptime هي "سلسلة ← تاريخ". تذكر: "f" = format (إخراج)، "p" = parse (إدخال).


3. timedelta: فروق التوقيت

PYTHON
from datetime import datetime, timedelta

now = datetime.now()

# حساب الأوقات المستقبلية/الماضية
future = now + timedelta(days=7)
past = now - timedelta(days=30)

print(f"In 7 days: {future.strftime('%Y-%m-%d')}")
print(f"30 days ago: {past.strftime('%Y-%m-%d')}")

# حساب الوقت
print(timedelta(days=7))                     # 7 days, 0:00:00
print(timedelta(hours=3, minutes=15))        # 3:15:00
print(timedelta(weeks=2))                    # 14 days, 0:00:00

# اطرح تاريخين
d1 = datetime(2026, 6, 1)
d2 = datetime(2026, 6, 23)
diff = d2 - d1
print(f"Difference: {diff.days} days")       # Difference: 22 days

مثال: تذكير انتهاء الاشتراك (الصعوبة ⭐⭐)

PYTHON
from datetime import datetime, timedelta

# محاكاة معلومات اشتراك المستخدم
subscriptions = [
    {"name": "Zhang San", "expire": "2026-07-15"},
    {"name": "Li Si", "expire": "2026-06-25"},
    {"name": "Wang Wu", "expire": "2026-08-01"},
    {"name": "Zhao Liu", "expire": "2026-06-20"},
]

today = datetime.now().strftime("%Y-%m-%d")
today = datetime.strptime(today, "%Y-%m-%d")

print("=== Subscription Expiry Check ===")
for sub in subscriptions:
    expire = datetime.strptime(sub["expire"], "%Y-%m-%d")
    remaining = (expire - today).days

    if remaining < 0:
        print(f"Expired ({sub['name']}): {-remaining} days ago")
    elif remaining <= 7:
        print(f"Expiring soon ({sub['name']}): {remaining} days left")
    else:
        print(f"Active ({sub['name']}): {remaining} days left")
▶ جرّب الكود

حالات الاستخدام الشائعة


❓ أسئلة شائعة

س هل datetime.now() يُرجع الوقت المحلي أم UTC؟
ج الوقت المحلي. استخدم datetime.utcnow() لـ UTC. لاحظ أن utcnow() يُرجع datetime بدون معلومات المنطقة الزمنية. للإنتاج، استخدم datetime.now(timezone.utc) أو pytz/zoneinfo لمعالجة المنطقة الزمنية بشكل صحيح. س:ماذا يحدث إذا فشل تحليل strptime؟ ج:يُثير ValueError — "time data 'xxx' does not match format '%Y-%m-%d'". لفّه في try-except لمعالجة الأخطاء. فخ شائع: الشهور والأيام يجب أن تكون برقمين (%m لن يطابق "6"، يحتاج "06"). س:ما الحد الأقصى للأيام التي يدعمها timedelta؟ ج:نظرياً لا حد أعلى — timedelta(days=1000000) صالح. لكن total_seconds() قد يفيض. للاستخدام اليومي، النطاق ليس مصدر قلق.

📖 ملخص

  • datetime.now() يحصل على الوقت والتاريخ الحاليين؛ date.today() يحصل على التاريخ فقط
  • strftime() تاريخ ← سلسلة؛ strptime() سلسلة ← تاريخ
  • التنسيقات الشائعة: %Y سنة، %m شهر، %d يوم، %H ساعة، %M دقيقة، %S ثانية
  • timedelta للحسابات التاريخية: days, hours, minutes, weeks
  • طرح كائني datetime يعطي timedelta؛ خاصية .days تحصل على الفرق بالأيام

📝 تمارين

  1. أساسي (الصعوبة ⭐): أخرج الوقت الحالي بهذه التنسيقات: 2026-06-23 Tuesday، 2026-06-23 16:00، 06/23/2026.

  2. متوسط (الصعوبة ⭐⭐): اكتب دالة workdays_between(start, end) تحسب عدد أيام العمل (الإثنين إلى الجمعة) بين تاريخين. تلميح: استخدم timedelta لتكرار كل يوم؛ استخدم weekday() للتحقق من يوم الأسبوع (0=الإثنين، 4=الجمعة).

  3. متقدم (الصعوبة ⭐⭐⭐): اكتب "مؤقت بومودورو." اعمل 25 دقيقة ← استرح 5 دقائق، كرر 4 مرات، ثم خذ استراحة طويلة 15 دقيقة. استخدم time.sleep() للتوقيت و datetime لعرض المرحلة الحالية والوقت المتبقي.

100%