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

التعامل مع التواريخ والأوقات هو واحد من أكثر المهام شيوعاً في البرمجة — تسجيل الطوابع الزمنية للسجلات، حساب أيام الاستعارة، تجميع البيانات عبر الفترات الزمنية... وحدة 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')}")
▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully


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")
▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
=== Subscription Expiry Check ===

▶ مثال: حاسبة مواعيد المشاريع (الصعوبة ⭐)

PYTHON
from datetime import datetime, timedelta

def countdown(deadline_str):
    deadline = datetime.strptime(deadline_str, "%Y-%m-%d")
    today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
    diff = (deadline - today).days
    return diff

projects = [
    {"name": "Course Assignment", "deadline": "2026-09-01"},
    {"name": "Graduation Project", "deadline": "2026-12-15"},
    {"name": "Internship Report", "deadline": "2026-08-20"},
]

print("=== Project Countdown ===")
for p in projects:
    days = countdown(p["deadline"])
    if days > 7:
        print(f"Active ({p['name']}): {days} days left")
    elif days > 0:
        print(f"Urgent ({p['name']}): only {days} days left!")
    elif days == 0:
        print(f"Due today ({p['name']})!")
    else:
        print(f"Overdue ({p['name']}): {-days} days ago")

future = datetime.now() + timedelta(days=30)
print(f"\n30 days from now: {future.strftime('%B %d, %Y')}")
▶ جرّب الكود

المخرجات (تختلف حسب التاريخ):

TEXT 📖 للعرض فقط
=== Project Countdown ===
Active (Course Assignment): 22 days left
Active (Graduation Project): 127 days left
Urgent (Internship Report): only 10 days left!

30 days from now: September 09, 2026


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



❓ أسئلة شائعة

س هل 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() قد يفيض. للاستخدام اليومي، النطاق ليس مصدر قلق.

📖 ملخص


📝 تمارين

  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 لعرض المرحلة الحالية والوقت المتبقي.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%