دليل عملي للتعامل مع التواريخ في بايثون باستخدام وحدة datetime
مقدمة: لماذا تُعد إدارة التواريخ مهمة في بايثون؟
التعامل مع الوقت والتاريخ من أكثر المهام شيوعاً في البرمجة، سواء كنت تطوّر نظام حجوزات، أو تحلّل بيانات، أو تبني تطبيقاً يسجّل الأحداث الزمنية في قاعدة بيانات. توفّر بايثون وحدة datetime كحل متكامل ومرن للتعامل مع التواريخ والأوقات بطريقة دقيقة وسهلة.
في هذا الدليل العملي، ستتعرّف إلى أهم استخدامات وحدة datetime، مثل تحويل النصوص إلى كائنات تاريخ، واستخراج اليوم الحالي، وتوليد سلسلة من التواريخ، وحساب الفروق الزمنية باستخدام timedelta، ثم إعادة تنسيق التاريخ كنص باستخدام strftime().

ما هي وحدة datetime في بايثون؟
تُعد وحدة datetime من الوحدات القياسية في بايثون، وهي مخصّصة للتعامل مع:
- التواريخ
Dates - الأوقات
Times - الطوابع الزمنية
Timestamps - الفروق الزمنية
Time Deltas
تكمن قوتها في أنها تساعدك على تحليل التاريخ، واستخراج مكوّناته، وإجراء العمليات الحسابية عليه، ثم عرضه بالتنسيق الذي يناسب تطبيقك.
كيفية تحويل النصوص الزمنية إلى كائنات datetime باستخدام strptime()
غالباً ما تصلنا التواريخ من واجهات المستخدم أو من ملفات خارجية على هيئة نصوص. هنا يأتي دور الدالة strptime()، إذ تقوم بتحويل سلسلة نصية تمثّل التاريخ والوقت إلى كائن من نوع datetime.
تحتاج هذه الدالة إلى قيمتين:
- النص الذي يحتوي على التاريخ.
- صيغة التنسيق المستخدمة داخل هذا النص.
from datetime import datetime
d = datetime.strptime(
"21-02-2021 18:46:00",
"%d-%m-%Y %H:%M:%S"
)
في هذا المثال، تم تحويل النص 21-02-2021 18:46:00 إلى كائن datetime بالاعتماد على صيغة التنسيق المحددة.
أهم رموز التنسيق المستخدمة مع strptime()
| الرمز | المعنى |
|---|---|
%d |
اليوم بصيغة رقمية مع صفر بادئ مثل 01 |
%m |
الشهر بصيغة رقمية مع صفر بادئ |
%Y |
السنة بأربعة أرقام |
%H |
الساعة بنظام 24-hour |
%M |
الدقائق |
%S |
الثواني |
فهم هذه الرموز يكفي للبدء في معظم التطبيقات العملية، خصوصاً عند قراءة التواريخ من ملفات CSV أو من مدخلات المستخدم.
كيفية الحصول على الطابع الزمني الحالي
في الكثير من الأنظمة، نحتاج إلى تسجيل وقت إنشاء السجل أو وقت تنفيذ حدث معيّن. للحصول على الوقت الحالي، يمكنك استخدام datetime.now().
from datetime import datetime
print(datetime.now())
تعيد هذه الدالة التاريخ والوقت الحاليين وفقاً لساعة النظام. وهي مفيدة عند:
- تسجيل العمليات
Logging - إنشاء مفاتيح زمنية للسجلات
- حفظ وقت إنشاء الطلبات أو الرسائل
كيفية معرفة اليوم الحالي من الأسبوع
إذا كنت تحتاج إلى معرفة اليوم الحالي، مثل تحديد ما إذا كان اليوم يوم عمل أو عطلة، فيمكنك استخدام الدالة weekday(). تعيد هذه الدالة رقماً من 0 إلى 6، حيث يمثّل 0 يوم الاثنين و6 يوم الأحد.
from datetime import datetime
today = datetime.now()
print(today.weekday())
يمكنك بعد ذلك ربط الرقم باسم اليوم باستخدام قائمة:
days = [
"Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"
]
print(days[datetime.now().weekday()])

هذا الأسلوب عملي جداً في تطبيقات التقارير، وجدولة المهام، وتحليل سلوك المستخدم حسب أيام الأسبوع.
كيفية إنشاء قائمة تواريخ بدءاً من تاريخ محدد
لنفترض أنك تريد إنشاء قائمة بالتواريخ الخاصة بالأسبوع القادم، سواء لتحليل المبيعات أو إعداد جدول شحن أو حتى لبناء تقويم داخل التطبيق. بدلاً من التعامل يدوياً مع اختلاف عدد أيام الشهور أو السنوات الكبيسة، يمكنك الاعتماد على datetime مع timedelta.

الفكرة الأساسية هنا هي البدء من تاريخ معيّن، ثم إضافة مدة زمنية مقدارها يوم واحد بشكل متكرر حتى تحصل على القائمة المطلوبة.
هذا النمط شائع في:
- التنبؤ بالمبيعات اليومية
- إنشاء جداول الاجتماعات
- تحليل البيانات الزمنية
- بناء تقاويم مخصّصة داخل التطبيقات
كيفية التعامل مع كائنات timedelta
يمثّل الكائن timedelta الفرق الزمني بين تاريخين أو وقتين. وهو مفيد عندما تريد معرفة المدة الفاصلة بين حدثين، مثل عدد الساعات منذ إنشاء طلب، أو عدد الأيام المتبقية حتى موعد معيّن.
إذا كان لديك تاريخان، فيمكنك طرح أحدهما من الآخر للحصول على كائن timedelta.

أهم المعاملات التي يدعمها timedelta
يمكن إنشاء كائن timedelta باستخدام عدد من الوسائط، من أهمها:
dayssecondsmicrosecondsmillisecondsminuteshoursweeks
وجميعها تساوي 0 افتراضياً إذا لم تُحدَّد.
ملاحظة مهمة عند حساب الساعات
من الأخطاء الشائعة توقّع أن الكائن timedelta يخزّن الساعات بشكل مباشر. في الواقع، التخزين الداخلي يعتمد أساساً على days وseconds وmicroseconds. لذلك، إذا أردت حساب عدد الساعات بدقة، فعادةً ما تحتاج إلى تحويل الناتج يدوياً.

والحل الأدق هو استخدام القيمة الكاملة للثواني عبر total_seconds() ثم تحويلها إلى ساعات:
hours = time_delta.total_seconds() / 3600

هذه الملاحظة مهمة جداً في الأنظمة التي تعتمد على حساب مدد الاشتراك، أو وقت تشغيل الخدمات، أو تقارير الإنتاجية.
كيفية تحويل كائنات datetime إلى نصوص باستخدام strftime()
بعد معالجة التواريخ داخل التطبيق، قد تحتاج إلى عرضها للمستخدم بتنسيق مفهوم، أو حفظها في ملف بتنسيق معيّن. هنا تستخدم الدالة strftime()، التي تسمح لك بالتحكم الكامل في طريقة تمثيل التاريخ كنص.

عند طباعة كائن datetime مباشرة، يظهر غالباً بصيغة ISO. لكن مع strftime() يمكنك إنتاج تنسيق يناسب واجهة المستخدم أو متطلبات النظام.
from datetime import datetime
now = datetime.now()
formatted = now.strftime("%d-%m-%Y %H:%M:%S")
print(formatted)
هذا مفيد في:
- عرض التاريخ داخل صفحات الويب
- تصدير البيانات إلى ملفات
- تهيئة النصوص قبل تخزينها
- إنشاء تقارير قابلة للقراءة
أفضل ممارسات التعامل مع التواريخ في بايثون
- احرص على توحيد صيغة التواريخ بين الإدخال والإخراج.
- استخدم
strptime()عند قراءة التاريخ من نص خارجي. - استخدم
strftime()عند الحاجة إلى عرض التاريخ للمستخدم. - اعتمد على
timedeltaفي الحسابات الزمنية بدلاً من المعالجة اليدوية. - عند حساب الساعات أو الدقائق بدقة، استخدم
total_seconds().
الخلاصة التقنية
تُعد وحدة datetime من أهم الأدوات التي يحتاجها أي مطوّر بايثون يتعامل مع البيانات الزمنية. فهي لا تكتفي بتحويل النصوص إلى تواريخ، بل تمنحك أيضاً إمكانات قوية لاستخراج المعلومات الزمنية، وتوليد نطاقات من التواريخ، وحساب الفروق بدقة، ثم إعادة تنسيق النتائج بالشكل المناسب. من الناحية العملية، إتقان datetime يوفّر وقتاً كبيراً، ويقلّل الأخطاء المنطقية المرتبطة بالوقت، ويجعل الشيفرة أكثر موثوقية واحترافية.