تحويل وتنسيق التواريخ في Python: strftime وstrptime وtimedelta

عند التعامل مع التواريخ في البرامج العملية، غالبًا لا تكون المشكلة في معرفة تاريخ اليوم، بل في تحويل التاريخ بين النص و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
%pAM أو PMPM

مثال عملي: اسم ملف تقرير يحتوي على التاريخ

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/2026datetime.strptime(...)
لديك datetime وتريد عرضه 01/10/2026strftime(...)
لديك ISO مثل 2026-10-01T14:30:00fromisoformat()
تريد الأيام بين موعديناطرح التاريخين واقرأ .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 ضمن كورس أساسيات بايثون.

إرسال تعليق

أحدث أقدم