كيفية استخدام كائنات timedelta في بايثون للتعامل مع التواريخ
ما هو كائن timedelta ولماذا نحتاج إليه؟
عند العمل على التواريخ والأوقات في لغة Python، ستتعامل غالباً مع الوحدة القياسية datetime. ومن داخل هذه الوحدة، يأتي كائن timedelta بوصفه أداة مهمة لتمثيل مدة زمنية يمكن استخدامها في إجراء عمليات حسابية مباشرة على التواريخ والأوقات.
بمعنى أبسط، يعبّر timedelta عن فرق زمني مثل عدد من الأيام أو الساعات أو الدقائق، ثم يتيح لك إضافته إلى كائن datetime أو طرحه منه للوصول إلى تاريخ مستقبلي أو سابق بسهولة ودقة.
في هذا الدليل، ستتعرّف على كيفية:
- إنشاء كائن
timedeltaأساسي. - عرض التاريخ والوقت الحاليين.
- حساب تاريخ في المستقبل.
- حساب تاريخ في الماضي.
- معرفة الوقت المتبقي حتى حدث معيّن أو الزمن المنقضي منذ وقوعه.
الاستيرادات الأساسية قبل البدء
قبل تنفيذ أي عمليات على التواريخ، نحتاج إلى استيراد المكوّنات المطلوبة من الوحدة datetime. الخطوة التالية تجهّز البيئة البرمجية للعمل بشكل صحيح:
# Import Necessary Modules
from datetime import date
from datetime import time
from datetime import datetime
from datetime import timedelta
يوفّر هذا الاستيراد الوصول إلى الكائنات التالية:
dateللتعامل مع التاريخ فقط.timeللتعامل مع الوقت فقط.datetimeللتعامل مع التاريخ والوقت معاً.timedeltaلتمثيل الفواصل الزمنية وإجراء العمليات الحسابية عليها.
كيفية إنشاء كائن timedelta في بايثون
يمكنك إنشاء كائن timedelta عبر تحديد المدة الزمنية التي تريد تمثيلها، سواء بالأيام أو الساعات أو الدقائق أو غيرها. إليك مثالاً عملياً:
time_delt1 = timedelta(days=270, hours=9, minutes=18)
print(time_delt1)
# Sample Output
# 270 days, 9:18:00
في المثال السابق، أنشأنا متغيراً باسم time_delt1 يحتوي على مدة زمنية مقدارها 270 يوماً و9 ساعات و18 دقيقة.
لكن إنشاء كائن timedelta وحده لا يكفي؛ إذ نحتاج إلى نقطة مرجعية زمنية مثل الوقت الحالي لكي نتمكن من إجراء عملية جمع أو طرح ذات معنى.
كيفية عرض التاريخ والوقت الحاليين في بايثون
حتى نستخدم المدة الزمنية التي أنشأناها، نحتاج أولاً إلى وقت مرجعي. وأشهر طريقة لذلك هي استدعاء الدالة now() من الكائن datetime للحصول على التاريخ والوقت الحاليين:
# to create reference, use current date and time
time_now = datetime.now()
print(time_now)
# Sample Output
# 2021-06-22 17:49:18.574503
المتغير time_now يمثّل اللحظة الحالية، ويمكن استخدامه كأساس لحساب تواريخ مستقبلية أو سابقة.
حساب تاريخ في المستقبل باستخدام timedelta
لحساب تاريخ مستقبلي، كل ما عليك فعله هو إضافة كائن timedelta إلى كائن datetime. هذه العملية مفيدة في تطبيقات كثيرة مثل تحديد موعد انتهاء اشتراك أو موعد تنفيذ مهمة بعد عدد معين من الأيام.
مثال على حساب تاريخ مستقبلي اعتماداً على مدة محددة
# check what date it'll be after time_delt1
future_date1 = time_now + time_delt1
print(future_date1)
# Sample Output
# 2022-03-20 03:07:18.574503
في هذا المثال، أضفنا المدة المخزنة في time_delt1 إلى الوقت الحالي، فحصلنا على تاريخ مستقبلي دقيق.
مثال على إضافة عدد أيام مباشر
ليس من الضروري دائماً إنشاء كائن مستقل ثم استخدامه لاحقاً؛ يمكنك أيضاً إنشاء timedelta مباشرة داخل العملية الحسابية:
# What day will it be after 189 days
future_date2 = time_now + timedelta(days=189)
print(future_date2)
# Sample Output
# 2021-12-28 17:49:18.574503
هذا الأسلوب مناسب عندما تكون العملية بسيطة ولا تحتاج إلى إعادة استخدام نفس المدة في أكثر من موضع.
حساب تاريخ في الماضي باستخدام timedelta
إذا أردت معرفة التاريخ الذي سبق اليوم بعدد محدد من الأيام، فالأمر لا يختلف كثيراً. بدلاً من استخدام عامل الجمع +، نستخدم عامل الطرح -.
# What day would it have been 189 days ago
past_date1 = time_now - timedelta(days=189)
print(past_date1)
# Sample Output
# 2020-12-15 17:49:18.574503
هذه الطريقة مفيدة في إعداد التقارير الزمنية، وتحليل السجلات، واسترجاع البيانات المتعلقة بفترة سابقة.
حساب الوقت المنقضي أو الوقت المتبقي حتى حدث معين
من أبرز استخدامات timedelta أيضاً حساب المدة الفاصلة بين تاريخ اليوم وحدث محدد، سواء كان هذا الحدث في المستقبل أو في الماضي.
استخدام date.today() للحصول على تاريخ اليوم
عند الحاجة إلى مقارنة يوم محدد بتاريخ اليوم فقط دون الوقت، يمكن استخدام الدالة today() التابعة للكائن date:
# Returns today's date
today = date.today()
والصيغة العامة تكون كالتالي:
today = date.today()
مثال عملي: حساب المدة المتبقية حتى يوم المعلم
سننشئ أولاً تاريخ يوم المعلم للسنة الحالية، ثم نقارنه بتاريخ اليوم لمعرفة عدد الأيام المتبقية:
# create reference objects for today, and teachers' day
teachers_day = date(time_now.year, 9, 5)
today = date.today()
بعد ذلك، نحسب الفرق الزمني بين التاريخين:
# calculate number of days to teachers' day.
time_to_td = teachers_day - today
print(f"Teachers' day is {time_to_td.days} days away")
# Sample Output
# Teachers' day is 74 days away
المتغير time_to_td سيكون كائناً من نوع timedelta، ومن خلال الخاصية .days يمكن استخراج عدد الأيام بسهولة.
ماذا لو كان الحدث قد مر بالفعل؟
في بعض الحالات، قد يكون التاريخ المستهدف قد انقضى بالفعل عند تشغيل البرنامج. لذلك من الأفضل إضافة شرط يتحقق من هذه الحالة لمعالجة النتيجة بشكل منطقي.
# check if teachers' day has passed
if teachers_day < today:
print(f"This year's Teachers' Day was {(today - teachers_day).days} days ago")
time_to_td = teachers_day - today
print(f"Next year's Teachers' day is {time_to_td.days} days away")
من الناحية العملية، يمكنك تطوير هذا المثال أكثر عبر تحديث تاريخ المناسبة إلى السنة التالية إذا كان تاريخ هذا العام قد مضى بالفعل، ثم إعادة الحساب للحصول على عدد الأيام المتبقية بدقة.
ملاحظات مهمة عند استخدام timedelta
- كائن
timedeltaلا يمثّل تاريخاً بحد ذاته، بل يمثّل مدة زمنية بين نقطتين. - يمكن استخدامه مع كائنات
dateوdatetimeلإجراء عمليات حسابية مباشرة. - عند طرح تاريخ من تاريخ آخر، تكون النتيجة غالباً كائناً من نوع
timedelta. - الخاصية
daysمفيدة لاستخراج عدد الأيام، لكن يمكن أيضاً التعامل مع الثواني والميكروثواني عند الحاجة. - يُفضّل تحديد نوع البيانات المستخدم بدقة: فإذا كنت تحتاج إلى التاريخ فقط فاستخدم
date، أما إذا كنت تحتاج إلى الوقت والتاريخ معاً فاستخدمdatetime.
أفضل استخدامات timedelta في المشاريع البرمجية
- حساب تواريخ انتهاء الاشتراكات أو الفترات التجريبية.
- إنشاء تنبيهات زمنية قبل موعد معين.
- تحليل الفارق بين وقتي بدء وانتهاء العمليات.
- بناء تقارير دورية يومية أو أسبوعية أو شهرية.
- إدارة الجداول الزمنية في التطبيقات الإدارية والتعليمية.
ملخص سريع لما تعلّمناه
رأينا في هذا المقال كيف يساعدنا الكائن timedelta في تنفيذ العمليات الزمنية الأساسية في Python بطريقة واضحة وفعالة. بدأنا بإنشاء مدة زمنية، ثم استخدمنا الوقت الحالي كنقطة مرجعية، وبعدها انتقلنا إلى حساب التواريخ المستقبلية والسابقة، وأخيراً تعلّمنا كيفية حساب الوقت المنقضي أو المتبقي حتى حدث معين.
إذا كنت تطور تطبيقاً يتعامل مع المواعيد أو المهام أو الاشتراكات أو التقارير الزمنية، فإن فهم timedelta سيمنحك أساساً قوياً لبناء منطق زمني دقيق وسهل الصيانة.
الخلاصة التقنية
يُعدّ timedelta واحداً من أكثر الأدوات العملية داخل الوحدة datetime في Python، لأنه يفصل بين مفهوم التاريخ ومفهوم المدة الزمنية بطريقة منظمة. هذا الفصل يجعل الشفرة أوضح، ويقلل الأخطاء عند إجراء الحسابات المرتبطة بالأيام والساعات. وكلما كان مشروعك يعتمد على جدولة الأحداث أو تتبع الوقت، أصبح إتقان timedelta ضرورة تقنية لا مجرد معرفة إضافية.