عند تعلم بايثون، ستحتاج في مرحلة ما إلى التعامل مع التاريخ والوقت: معرفة تاريخ اليوم، تسجيل وقت تنفيذ عملية، حساب الفرق بين تاريخين، تنسيق التاريخ بشكل مناسب للمستخدم، أو إنشاء عداد تنازلي بسيط.
لهذا السبب توفر بايثون وحدة جاهزة اسمها datetime. هذه الوحدة تساعدك على التعامل مع التاريخ والوقت بطريقة منظمة بدل الاعتماد على النصوص أو الحسابات اليدوية.
في هذا المقال من بايثون العرب سنتعلم شرح datetime في بايثون خطوة بخطوة، بداية من الحصول على التاريخ الحالي، مرورًا بتنسيق التاريخ باستخدام strftime، وتحويل النص إلى تاريخ باستخدام strptime، وحتى حساب الفروقات الزمنية باستخدام timedelta.
{getToc} $title={محتوى المقال}
{alertInfo} يمكنك تجربة جميع الأكواد مباشرة من خلال محرر بايثون العرب بدون تثبيت أي برنامج: محرر بايثون أون لاين
ما هي وحدة datetime في بايثون؟
وحدة datetime هي مكتبة مدمجة داخل بايثون، أي أنك لا تحتاج إلى تثبيتها. وظيفتها الأساسية هي مساعدتك في إنشاء التواريخ، قراءة الوقت الحالي، تنسيق التاريخ، تحويل النصوص إلى تواريخ، وحساب الفروقات الزمنية.
لاستخدامها، نبدأ بعملية الاستيراد:
import datetime
بعد الاستيراد تستطيع استخدام الأدوات الموجودة داخل الوحدة، مثل:
datetime.dateللتعامل مع التاريخ فقط.datetime.datetimeللتعامل مع التاريخ والوقت معًا.datetime.timedeltaلحساب الفرق بين تاريخين أو إضافة أيام وساعات.
لماذا نحتاج datetime في مشاريع بايثون؟
قد تبدو التواريخ بسيطة في البداية، لكنها تظهر في مشاريع كثيرة جدًا. مثلًا:
- تسجيل وقت إنشاء ملف أو تقرير.
- حساب عمر المستخدم من تاريخ الميلاد.
- معرفة عدد الأيام المتبقية على موعد معين.
- تنسيق التاريخ قبل عرضه في تطبيق أو موقع.
- التعامل مع مواعيد مختلفة بين الدول والمناطق الزمنية.
{alertSuccess} إذا كنت تتعلم بايثون للتطبيق العملي، ففهم datetime سيخدمك في مشاريع كثيرة مثل الجداول، التقارير، المهام المجدولة، وتطبيقات المواعيد.
1. الحصول على التاريخ الحالي في بايثون
إذا أردت الحصول على تاريخ اليوم فقط بدون الساعة، يمكنك استخدام date.today().
import datetime
today = datetime.date.today()
print(today)
مثال على الناتج:
2026-04-27
هذا مفيد عندما تريد تسجيل تاريخ اليوم فقط، مثل تاريخ إنشاء طلب، أو تاريخ حفظ تقرير، أو تاريخ دخول المستخدم.
2. الحصول على التاريخ والوقت معًا
إذا أردت التاريخ والوقت معًا، استخدم datetime.datetime.now().
import datetime
now = datetime.datetime.now()
print(now)
مثال على الناتج:
2026-04-27 18:45:12.123456
الناتج يحتوي على السنة، الشهر، اليوم، الساعة، الدقيقة، الثانية، وحتى الميكروثانية.
3. استخراج أجزاء التاريخ والوقت
بعد الحصول على كائن التاريخ والوقت، يمكنك استخراج أجزاء محددة منه مثل السنة أو الشهر أو اليوم أو الساعة.
import datetime
now = datetime.datetime.now()
print(now.year) # السنة
print(now.month) # الشهر
print(now.day) # اليوم
print(now.hour) # الساعة
print(now.minute) # الدقيقة
print(now.second) # الثانية
هذه الطريقة مفيدة جدًا عندما تريد مثلًا عرض السنة فقط، أو بناء اسم ملف يحتوي على التاريخ، أو مقارنة الشهر الحالي بشهر معين.
4. إنشاء تاريخ أو وقت محدد
ليس دائمًا نحتاج إلى التاريخ الحالي. أحيانًا نريد إنشاء تاريخ معين، مثل تاريخ ميلاد، موعد اختبار، تاريخ انتهاء اشتراك، أو موعد حدث قادم.
لإنشاء تاريخ فقط:
import datetime
birthday = datetime.date(1995, 8, 15)
print(birthday)
الناتج:
1995-08-15
ولإنشاء تاريخ مع وقت:
import datetime
meeting = datetime.datetime(2026, 4, 27, 14, 30, 0)
print(meeting)
الناتج:
2026-04-27 14:30:00
{alertWarning} انتبه لترتيب القيم عند إنشاء datetime: السنة، الشهر، اليوم، الساعة، الدقيقة، الثانية.
5. تنسيق التاريخ باستخدام strftime
أحيانًا يكون شكل التاريخ الافتراضي غير مناسب للمستخدم. مثلًا قد تريد عرض التاريخ بهذه الطريقة:
27/04/2026
بدل:
2026-04-27.
هنا نستخدم الدالة strftime()، وهي تعني تحويل التاريخ إلى نص بتنسيق محدد.
import datetime
now = datetime.datetime.now()
print(now.strftime("%Y-%m-%d"))
print(now.strftime("%d/%m/%Y"))
print(now.strftime("%A, %d %B %Y"))
print(now.strftime("%I:%M %p"))
أمثلة على الناتج:
2026-04-27
27/04/2026
Monday, 27 April 2026
06:45 PM
أهم رموز strftime في بايثون
| الرمز | المعنى | مثال |
|---|---|---|
%Y |
السنة كاملة | 2026 |
%m |
الشهر كرقم | 04 |
%B |
اسم الشهر | April |
%d |
اليوم كرقم | 27 |
%A |
اسم اليوم | Monday |
%H |
الساعة بنظام 24 | 18 |
%I |
الساعة بنظام 12 | 06 |
%M |
الدقائق | 45 |
%S |
الثواني | 12 |
%p |
AM أو PM | PM |
{alertInfo} استخدم strftime عندما تريد عرض التاريخ للمستخدم بشكل جميل ومفهوم.
6. تحويل النص إلى تاريخ باستخدام strptime
أحيانًا تحصل على التاريخ كنص، مثل إدخال المستخدم:
"15-08-1995".
لكن إذا بقي التاريخ نصًا، لن تستطيع حساب الفرق بينه وبين تاريخ آخر بسهولة.
لذلك نستخدم strptime() لتحويل النص إلى كائن تاريخ حقيقي.
import datetime
date_string = "15-08-1995"
birthday = datetime.datetime.strptime(date_string, "%d-%m-%Y")
print(birthday)
print(type(birthday))
الناتج:
1995-08-15 00:00:00
<class 'datetime.datetime'>
لاحظ أن التنسيق "%d-%m-%Y" يجب أن يطابق شكل النص تمامًا. إذا كان النص مكتوبًا بهذه الطريقة "1995/08/15" فستحتاج إلى تنسيق مختلف.
الفرق بين strftime و strptime
| الدالة | ماذا تفعل؟ | مثال مختصر |
|---|---|---|
strftime |
تحول التاريخ إلى نص منسق | date → string |
strptime |
تحول النص إلى تاريخ | string → date |
{alertSuccess} تذكرها بسهولة: strftime تعني Format، أما strptime تعني Parse.
7. حساب الفرق بين تاريخين باستخدام timedelta
إذا أردت حساب الفرق بين تاريخين، فإن بايثون تعطيك كائنًا من نوع timedelta. هذا مفيد لحساب العمر بالأيام، أو الأيام المتبقية لموعد، أو مدة تنفيذ عملية.
from datetime import datetime
today = datetime.now()
birthday = datetime(1995, 8, 15)
age = today - birthday
print(age)
print(age.days)
يمكنك أيضًا إضافة أو طرح أيام وساعات باستخدام timedelta:
from datetime import datetime, timedelta
today = datetime.now()
one_week_later = today + timedelta(weeks=1)
yesterday = today - timedelta(days=1)
print(one_week_later)
print(yesterday.strftime("%Y-%m-%d"))
تستطيع استخدام معاملات مثل:
daysللأيام.weeksللأسابيع.hoursللساعات.minutesللدقائق.secondsللثواني.
8. التعامل مع المناطق الزمنية باستخدام zoneinfo
في التطبيقات الواقعية، قد تحتاج إلى التعامل مع أكثر من منطقة زمنية. مثلًا لديك مستخدم في الرياض وآخر في نيويورك، وتريد عرض الوقت المناسب لكل واحد.
في بايثون 3.9 وما بعده، يمكنك استخدام وحدة zoneinfo.
from datetime import datetime
from zoneinfo import ZoneInfo
riyadh_time = datetime.now(ZoneInfo("Asia/Riyadh"))
ny_time = datetime.now(ZoneInfo("America/New_York"))
print(riyadh_time)
print(ny_time)
converted = riyadh_time.astimezone(ZoneInfo("America/New_York"))
print(converted)
{alertInfo} المناطق الزمنية مهمة في تطبيقات المواعيد، المتاجر، التقارير، والأنظمة التي يستخدمها أشخاص من دول مختلفة.
9. مشروع صغير: عداد تنازلي باستخدام datetime
لنطبق ما تعلمناه في مشروع صغير يحسب الأيام المتبقية حتى بداية سنة 2027.
from datetime import datetime
new_year = datetime(2027, 1, 1)
now = datetime.now()
remaining = new_year - now
print("الأيام المتبقية حتى 2027:")
print(remaining.days)
هذا المثال يعلمك فكرة مهمة: التاريخ في بايثون ليس مجرد نص، بل كائن يمكن إجراء العمليات عليه.
أخطاء شائعة عند استخدام datetime
1. نسيان import datetime
إذا استخدمت datetime بدون استيرادها، سيظهر غالبًا خطأ NameError.
import datetime
2. الخلط بين date و datetime
date يمثل التاريخ فقط، أما datetime فيمثل التاريخ والوقت معًا.
| النوع | يمثل ماذا؟ | مثال |
|---|---|---|
date |
تاريخ فقط | 2026-04-27 |
datetime |
تاريخ ووقت | 2026-04-27 18:45:12 |
3. عدم مطابقة تنسيق strptime للنص
إذا كان النص بهذا الشكل:
15-08-1995
فيجب أن يكون التنسيق:
%d-%m-%Y
أما إذا كان النص بهذا الشكل:
1995/08/15
فسيكون التنسيق:
%Y/%m/%d
روابط مفيدة من بايثون العرب
- شرح عمليات بايثون Operators للمبتدئين
- شرح القوائم Lists في بايثون
- شرح القواميس Dictionaries في بايثون
- كيف تقرأ رسائل الخطأ في بايثون؟
- محرر بايثون العرب لتجربة الأكواد أون لاين
الخلاصة
وحدة datetime من الأدوات المهمة في بايثون، لأنها تساعدك على التعامل مع التاريخ والوقت بطريقة عملية. تعلمنا في هذا المقال كيف نحصل على تاريخ اليوم، وكيف نقرأ الوقت الحالي، وكيف نستخرج أجزاء التاريخ، وننسق التاريخ باستخدام strftime، ونحول النص إلى تاريخ باستخدام strptime، ونحسب الفروقات الزمنية باستخدام timedelta.
ابدأ بتجربة الأمثلة البسيطة، ثم حاول بناء مشروع صغير مثل عداد تنازلي، أو برنامج يحسب العمر بالأيام، أو سكربت يسجل وقت تنفيذ مهمة معينة.
{alertSuccess} الخلاصة السريعة: استخدم datetime عندما تحتاج إلى تاريخ أو وقت حقيقي داخل برنامجك، ولا تتعامل مع التواريخ كنصوص إلا عند العرض أو الإدخال.