مكتبة datetime في Python توفر أدوات قوية للتعامل مع التواريخ والأوقات. هذه المكتبة ضرورية لإنشاء التقارير، التحليلات، جدولة الأحداث، ومعالجة الطوابع الزمنية في أي مشاريع برمجية.
أساسيات التعامل مع مكتبة datetime
الاستيراد والفئات الأساسية
مكتبة datetime مضمنة في المكتبة القياسية لـ Python ولا تتطلب تثبيتًا إضافيًا:
import datetime
from datetime import date, time, datetime, timedelta, timezone
الفئات الأساسية للمكتبة:
- datetime.date — التعامل مع التواريخ (السنة، الشهر، اليوم)
- datetime.time — التعامل مع الوقت (الساعات، الدقائق، الثواني)
- datetime.datetime — يجمع بين التاريخ والوقت
- datetime.timedelta — يمثل الفرق بين التواريخ/الأوقات
- datetime.timezone — التعامل مع المناطق الزمنية
الحصول على التاريخ والوقت الحاليين
from datetime import datetime, date
# التاريخ والوقت الحاليان
now = datetime.now()
print(f"التاريخ والوقت الحاليان: {now}")
# التاريخ الحالي فقط
today = date.today()
print(f"تاريخ اليوم: {today}")
إنشاء التواريخ والتعامل معها
إنشاء التواريخ يدويًا
from datetime import date, datetime
# إنشاء تاريخ محدد
custom_date = date(2025, 5, 9)
print(f"التاريخ المحدد: {custom_date}")
# إنشاء تاريخ ووقت
custom_datetime = datetime(2025, 5, 9, 14, 30, 45)
print(f"التاريخ والوقت المحددان: {custom_datetime}")
استخراج مكونات التاريخ
today = date.today()
print(f"السنة: {today.year}")
print(f"الشهر: {today.month}")
print(f"اليوم: {today.day}")
print(f"يوم الأسبوع: {today.weekday()}") # 0 = الاثنين، 6 = الأحد
التعامل مع الوقت
إنشاء كائنات الوقت والتعامل معها
from datetime import time
# إنشاء وقت
custom_time = time(14, 30, 45)
print(f"الوقت المحدد: {custom_time}")
# استخراج مكونات الوقت
print(f"الساعات: {custom_time.hour}")
print(f"الدقائق: {custom_time.minute}")
print(f"الثواني: {custom_time.second}")
الحصول على الوقت مع الميكروثواني
from datetime import datetime
now = datetime.now()
print(f"الوقت مع الميكروثواني: {now}")
print(f"الميكروثواني: {now.microsecond}")
العمليات الحسابية على التواريخ
استخدام timedelta
from datetime import date, datetime, timedelta
# العمليات على التواريخ
today = date.today()
tomorrow = today + timedelta(days=1)
last_week = today - timedelta(weeks=1)
next_month = today + timedelta(days=30)
print(f"غدًا: {tomorrow}")
print(f"قبل أسبوع: {last_week}")
print(f"بعد شهر: {next_month}")
# عمليات أكثر تعقيدًا
future_date = today + timedelta(days=100, hours=5, minutes=30)
print(f"بعد 100 يوم و5 ساعات و30 دقيقة: {future_date}")
حساب الفرق بين التواريخ
from datetime import date, datetime
start_date = date(2025, 1, 1)
end_date = date(2025, 12, 31)
# الفرق بالأيام
difference = end_date - start_date
print(f"الفرق بالأيام: {difference.days}")
# الفرق بالثواني لكائنات datetime
start_time = datetime(2025, 5, 9, 10, 0, 0)
end_time = datetime(2025, 5, 9, 15, 30, 45)
time_diff = end_time - start_time
print(f"الفرق بالثواني: {time_diff.total_seconds()}")
print(f"الفرق بالساعات: {time_diff.total_seconds() / 3600}")
تنسيق التواريخ والأوقات
طريقة strftime
from datetime import datetime
now = datetime.now()
# تنسيقات مختلفة
print(now.strftime("%Y-%m-%d")) # 2025-05-09
print(now.strftime("%d/%m/%Y")) # 09/05/2025
print(now.strftime("%A, %d %B %Y")) # الجمعة، 09 مايو 2025
print(now.strftime("%H:%M:%S")) # 14:30:45
print(now.strftime("%I:%M %p")) # 02:30 مساءً
تحليل النصوص إلى تواريخ باستخدام strptime
from datetime import datetime
# تحويل نص إلى تاريخ
date_string = "2025-05-09 14:30:45"
parsed_date = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(f"التاريخ المحلل: {parsed_date}")
# تنسيقات أخرى
date_string2 = "09/05/2025"
parsed_date2 = datetime.strptime(date_string2, "%d/%m/%Y")
print(f"التاريخ المحلل: {parsed_date2}")
التعامل مع المناطق الزمنية
استخدام timezone
from datetime import datetime, timezone, timedelta
# إنشاء منطقة زمنية
utc_timezone = timezone.utc
local_timezone = timezone(timedelta(hours=3)) # توقيت موسكو (UTC+3)
# الحصول على الوقت الحالي في UTC
utc_now = datetime.now(utc_timezone)
print(f"توقيت UTC: {utc_now}")
# تحويل إلى منطقة زمنية محلية
local_now = utc_now.astimezone(local_timezone)
print(f"التوقيت المحلي: {local_now}")
استخدام pytz للمناطق الزمنية المتقدمة
# تثبيت المكتبة أولاً: pip install pytz
from datetime import datetime
import pytz
# الحصول على الوقت في منطقة زمنية محددة
cairo_timezone = pytz.timezone("Africa/Cairo")
cairo_time = datetime.now(cairo_timezone)
print(f"توقيت القاهرة: {cairo_time}")
# تحويل بين المناطق الزمنية
utc_time = datetime.now(pytz.utc)
riyadh_time = utc_time.astimezone(pytz.timezone("Asia/Riyadh"))
print(f"توقيت الرياض: {riyadh_time}")
أمثلة عملية
حساب العمر
from datetime import date
def calculate_age(birth_date):
today = date.today()
age = today.year - birth_date.year
# التحقق مما إذا كان عيد الميلاد قد حدث هذا العام
if (today.month, today.day) < (birth_date.month, birth_date.day):
age -= 1
return age
# مثال
birthday = date(1990, 5, 15)
age = calculate_age(birthday)
print(f"العمر: {age} سنة")
التحقق من صحة التاريخ
from datetime import datetime
def validate_date(date_string, format="%Y-%m-%d"):
try:
datetime.strptime(date_string, format)
return True
except ValueError:
return False
# أمثلة
print(validate_date("2025-05-09")) # True
print(validate_date("2025-13-01")) # False (شهر غير صالح)
print(validate_date("09/05/2025", "%d/%m/%Y")) # True
جدولة المهام
from datetime import datetime, timedelta
def schedule_task(start_date, days_ahead):
scheduled_date = start_date + timedelta(days=days_ahead)
return scheduled_date
# مثال: مهمة بعد 7 أيام من الآن
start = datetime.now()
task_date = schedule_task(start, 7)
print(f"تاريخ المهمة المجدولة: {task_date}")
نصائح وأفضل الممارسات
- استخدم timezone.utc دائمًا للتخزين الداخلي للتواريخ لتجنب مشاكل المناطق الزمنية
- عند التعامل مع تواريخ المستخدمين، قم دائمًا بالتحويل إلى UTC ثم التخزين
- استخدم مكتبة pytz أو zoneinfo (Python 3.9+) للمناطق الزمنية المعقدة
- تجنب استخدام datetime.now() بدون منطقة زمنية في التطبيقات العالمية
- قم دائمًا بالتحقق من صحة تواريخ الإدخال باستخدام strptime أو مكتبات خارجية مثل dateutil
الخلاصة
مكتبة datetime في Python هي أداة أساسية لأي مطور. من خلال فهم الفئات الأساسية مثل date وtime وdatetime وtimedelta وtimezone، يمكنك التعامل مع أي متطلبات تتعلق بالتواريخ والأوقات في مشاريعك. تذكر دائمًا التعامل مع المناطق الزمنية بعناية لضمان دقة تطبيقاتك.