عند التعامل مع التواريخ في البرامج العملية، غالبًا لا تكون المشكلة في معرفة تاريخ اليوم، بل في تحويل التاريخ بين النص وdatetime، تنسيقه، مقارنته، وحساب الفرق بين تاريخين.
في هذا الدليل من بايثون العرب سنركز على هذه العمليات العملية: تحويل string إلى datetime باستخدام strptime()، وتحويل datetime إلى نص باستخدام strftime()، ثم استخدام timedelta لإضافة الوقت أو حساب الفروق، مع مقارنة التواريخ ومقدمة قصيرة للمناطق الزمنية.
{alertInfo} هذه الصفحة تفترض أنك تعرف أساسياتdatetime. إذا كنت تريد أولًا فهمdateوdatetimeوالحصول على الوقت الحالي، راجع شرح مكتبة datetime في Python ضمن كورس الأساسيات. هنا سنركز على التحويل والتنسيق والحساب.
{getToc} $title={محتوى المقال}
خريطة سريعة: أي أداة تستخدم لكل مهمة؟
| المهمة | الأداة المناسبة | الفكرة |
|---|---|---|
| تحويل نص إلى تاريخ | strptime() | string → datetime |
| تحويل تاريخ إلى نص منسق | strftime() | datetime → string |
| حساب الفرق بين تاريخين | الطرح | النتيجة timedelta |
| إضافة أو طرح مدة | timedelta() | أيام أو ساعات أو دقائق |
| مقارنة تاريخين | < و> و== | بعد تحويل القيم إلى كائنات تاريخ |
مراجعة قصيرة قبل التحويل: نحتاج كائن تاريخ حقيقي
العمليات التالية تعمل على كائنات date أو datetime، وليس على نصوص عشوائية. مثلًا يمكن الحصول على تاريخ اليوم بـdate.today() أو إنشاء datetime محدد. لكن هذه الصفحة لن تعيد شرح هذه الأساسيات بالتفصيل.
وبمجرد امتلاك كائن datetime يمكنك الوصول إلى خصائص مثل السنة والشهر واليوم والساعة، ثم تحويله أو مقارنته أو إجراء العمليات الحسابية عليه.
تحويل String إلى datetime باستخدام strptime()
إذا جاء التاريخ من نموذج إدخال، ملف CSV، API أو قاعدة بيانات، فقد يصل إليك كنص. لا تقارن هذا النص مباشرة ولا تحسب عليه قبل تحويله إلى كائن تاريخ.
تستخدم datetime.strptime() عندما تعرف شكل النص وتريد تحويله إلى datetime.
from datetime import datetime
date_text = "01/10/2026"
date_value = datetime.strptime(date_text, "%d/%m/%Y")
print(date_value)
print(type(date_value))
الناتج:
2026-10-01 00:00:00
<class 'datetime.datetime'>
النقطة الحاسمة هنا أن صيغة التنسيق يجب أن تطابق النص. في المثال السابق:
%dيمثل اليوم.%mيمثل الشهر.%Yيمثل السنة بأربعة أرقام.
مثال على تاريخ يحتوي على الوقت
from datetime import datetime
date_text = "2026-10-01 14:30:00"
date_value = datetime.strptime(date_text, "%Y-%m-%d %H:%M:%S")
print(date_value)
الناتج:
2026-10-01 14:30:00
إذا كان النص بصيغة ISO
عندما يكون النص أصلًا بصيغة ISO 8601 شائعة، يمكن أن يكون fromisoformat() أبسط من كتابة رموز التنسيق يدويًا:
from datetime import datetime
date_value = datetime.fromisoformat("2026-10-01T14:30:00")
print(date_value)
{alertWarning} إذا لم يطابق النص التنسيق المحدد فيstrptime()فستحصل عادة علىValueError. لذلك لا تغيّر صيغة الإدخال دون تحديث format المقابل لها.
تنسيق datetime إلى String باستخدام strftime()
الاتجاه المعاكس هو تحويل كائن datetime إلى نص مناسب للعرض أو اسم ملف أو تقرير. هنا نستخدم strftime().
from datetime import datetime
date_value = datetime(2026, 10, 1, 14, 30)
print(date_value.strftime("%Y-%m-%d"))
print(date_value.strftime("%d/%m/%Y"))
print(date_value.strftime("%d/%m/%Y %H:%M"))
الناتج:
2026-10-01
01/10/2026
01/10/2026 14:30
أهم رموز التنسيق
| الرمز | المعنى | مثال |
|---|---|---|
%Y | السنة بأربعة أرقام | 2026 |
%m | الشهر كرقم | 10 |
%d | اليوم | 01 |
%H | الساعة بنظام 24 ساعة | 14 |
%I | الساعة بنظام 12 ساعة | 02 |
%M | الدقائق | 30 |
%S | الثواني | 00 |
%A | اسم اليوم | Thursday |
%B | اسم الشهر | October |
%p | AM أو PM | PM |
مثال عملي: اسم ملف تقرير يحتوي على التاريخ
from datetime import datetime
report_time = datetime(2026, 10, 1, 13, 45)
file_name = report_time.strftime("report_%Y-%m-%d_%H-%M.csv")
print(file_name)
الناتج:
report_2026-10-01_13-45.csv
الفرق بين strptime وstrftime
| الدالة | المدخل | الناتج | متى تستخدمها؟ |
|---|---|---|---|
strptime() | نص | datetime | عند قراءة تاريخ مكتوب كنص |
strftime() | date/datetime | نص | عند عرض أو حفظ التاريخ بتنسيق معين |
تذكرها بهذه الصورة: Parse يعني قراءة النص وتحويله إلى تاريخ، وFormat يعني أخذ التاريخ وتحويله إلى نص منسق.
حساب الفرق بين تاريخين باستخدام timedelta
عند طرح كائنَي datetime من بعضهما، تكون النتيجة كائن timedelta. منه يمكنك معرفة عدد الأيام أو إجمالي الثواني ثم تحويلها إلى ساعات أو دقائق.
from datetime import datetime
start = datetime(2026, 10, 1, 9, 0)
end = datetime(2026, 10, 3, 12, 30)
difference = end - start
print(difference.days)
print(difference.total_seconds() / 3600)
الناتج:
2
51.5
{alertInfo} إذا كنت تريد إجمالي المدة بالثواني فاستخدمtotal_seconds(). الخاصيةsecondsوحدها لا تمثل دائمًا إجمالي عدد الثواني في مدة تمتد لأكثر من يوم.
إضافة أو طرح أيام وساعات باستخدام timedelta
يمكن استخدام timedelta أيضًا لبناء موعد جديد انطلاقًا من تاريخ موجود.
from datetime import datetime, timedelta
start = datetime(2026, 10, 1, 10, 0)
one_week_later = start + timedelta(weeks=1)
two_hours_before = start - timedelta(hours=2)
print(one_week_later)
print(two_hours_before)
الناتج:
2026-10-08 10:00:00
2026-10-01 08:00:00
يمكنك استخدام days وweeks وhours وminutes وseconds حسب نوع المدة التي تريد إضافتها أو طرحها.
مقارنة تاريخين في Python
بعد تحويل القيم إلى كائنات datetime، يمكنك مقارنتها مباشرة باستخدام معاملات المقارنة المعتادة.
from datetime import datetime
first = datetime(2026, 10, 1, 9, 0)
second = datetime(2026, 10, 5, 9, 0)
print(first < second)
print(first == second)
print(second > first)
الناتج:
True
False
True
مقارنة التاريخ فقط وتجاهل الوقت
إذا كان لديك كائنان datetime في اليوم نفسه لكن بوقت مختلف، استخدم .date() إذا كان المطلوب مقارنة اليوم فقط.
from datetime import datetime
morning = datetime(2026, 10, 1, 8, 0)
evening = datetime(2026, 10, 1, 18, 0)
print(morning == evening)
print(morning.date() == evening.date())
الناتج:
False
True
أما إذا كانت التواريخ مخزنة كنصوص بصيغ مختلفة، فلا تعتمد على مقارنة النصوص نفسها. حوّلها أولًا باستخدام strptime() أو fromisoformat().
أساسيات المناطق الزمنية باستخدام zoneinfo
إذا كان برنامجك يتعامل مع مواعيد في دول مختلفة، فاستخدم كائنات datetime تحتوي على معلومات المنطقة الزمنية بدل التعامل مع وقت محلي غير محدد.
from datetime import datetime
from zoneinfo import ZoneInfo
aden_time = datetime(2026, 10, 1, 15, 0, tzinfo=ZoneInfo("Asia/Aden"))
london_time = aden_time.astimezone(ZoneInfo("Europe/London"))
print(aden_time.isoformat())
print(london_time.isoformat())
مثال على الناتج في هذا التاريخ:
2026-10-01T15:00:00+03:00
2026-10-01T13:00:00+01:00
هذا القسم مجرد أساس عملي. إذا بدأت باستخدام المناطق الزمنية، حافظ على اتساق الكائنات التي تقارنها أو تطرحها: لا تخلط datetime يحتوي على timezone مع آخر بدون timezone في عمليات الترتيب أو الطرح.
مثال عملي: قراءة موعد من نص وإنشاء تذكير قبله
هذا المثال يجمع التحويل والحساب والتنسيق في سيناريو واحد: نستقبل الموعد كنص، نحوله إلى datetime، ننشئ وقت تذكير قبله بساعتين، ثم نطبع النتيجة بتنسيق مفهوم.
from datetime import datetime, timedelta
appointment_text = "05/10/2026 14:30"
appointment = datetime.strptime(
appointment_text,
"%d/%m/%Y %H:%M"
)
reminder = appointment - timedelta(hours=2)
print("الموعد:", appointment.strftime("%d/%m/%Y %H:%M"))
print("التذكير:", reminder.strftime("%d/%m/%Y %H:%M"))
الناتج:
الموعد: 05/10/2026 14:30
التذكير: 05/10/2026 12:30
أخطاء شائعة عند تحويل وحساب التواريخ
- عدم تطابق format مع النص: النص
01/10/2026يحتاج صيغة مثل%d/%m/%Y، وليس%Y-%m-%d. - مقارنة التواريخ كنصوص: حوّلها إلى
dateأوdatetimeأولًا. - استخدام
difference.secondsكإجمالي للمدة: استخدمtotal_seconds()إذا أردت الإجمالي الكامل. - الخلط بين تنسيق الإدخال وتنسيق العرض: استخدم
strptime()للقراءة وstrftime()للعرض. - الخلط بين datetime مع timezone وآخر بدونها: وحّد طريقة تمثيل الوقت قبل المقارنة أو الطرح.
متى تستخدم كل طريقة؟
| السيناريو | الحل |
|---|---|
المستخدم أدخل 01/10/2026 | datetime.strptime(...) |
لديك datetime وتريد عرضه 01/10/2026 | strftime(...) |
لديك ISO مثل 2026-10-01T14:30:00 | fromisoformat() |
| تريد الأيام بين موعدين | اطرح التاريخين واقرأ .days |
| تريد إجمالي الساعات أو الدقائق | total_seconds() ثم التحويل |
| تريد موعدًا بعد 7 أيام | date + timedelta(days=7) |
| تريد معرفة أي تاريخ أقدم | قارن كائنات التاريخ بـ< و> |
مصادر رسمية للتوسع
أسئلة شائعة
كيف أحول String إلى datetime في Python؟
استخدم datetime.strptime(text, format) عندما تعرف شكل النص، مثل datetime.strptime("01/10/2026", "%d/%m/%Y").
كيف أحول datetime إلى String؟
استخدم strftime() وحدد شكل الإخراج المطلوب، مثل date_value.strftime("%Y-%m-%d").
كيف أحسب الفرق بين تاريخين؟
اطرح كائن التاريخ الأقدم من الأحدث. النتيجة ستكون timedelta ويمكن قراءة .days أو استخدام total_seconds().
كيف أضيف أيامًا إلى تاريخ في Python؟
استخدم timedelta، مثل new_date = old_date + timedelta(days=7).
كيف أقارن تاريخين في Python؟
بعد تحويلهما إلى date أو datetime استخدم معاملات المقارنة مثل < و> و==. إذا أردت تجاهل الوقت فاستخدم .date().
الخلاصة
في التطبيقات العملية، تعامل مع التاريخ كبيانات حقيقية لا كنصوص. استخدم strptime() لتحويل النص إلى datetime، وstrftime() لإعادة تنسيقه كنص، واستخدم timedelta للحسابات الزمنية، ثم قارن كائنات التاريخ نفسها بدل مقارنة النصوص.
{alertSuccess} المسار العملي الأكثر شيوعًا: اقرأ التاريخ من النص → حوّله إلىdatetime→ نفّذ الحساب أو المقارنة → استخدمstrftime()عند العرض أو إنشاء التقرير.
وإذا احتجت مراجعة إنشاء كائنات التاريخ والحصول على الوقت الحالي، ارجع إلى درس datetime ضمن كورس أساسيات بايثون.