Python/datetime
تقدّم وحدة datetime
عددًا من الأصناف التي تعالج التاريخ والوقت بطرق مبسّطة وأخرى معقدة، وتدعم بايثون إجراء العمليات الحسابية على التواريخ والأوقات.
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2018, 3, 24)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'03-24-18. 24 Mar 2018 is a Saturday on the 24 day of March.'
>>> # تدعم التواريخ العمليات الحسابية
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368
هناك نوعان من كائنات الوقت والتاريخ: "البسيط naive" و "الواعي aware".
يمتلك الكائن الواعي معرفة كافية بالعمليات الحسابية والتعديلات الدولية على الأوقات، كالمناطق الزمنية والتوقيت الصيفي، وتعديل القيمة الخاصّة به بصورة تتناسب مع الكائنات الواعية الأخرى. يستخدم الكائن الواعي لتمثيل فترة زمنية معيّنة غير مفتوحة للتفسير.
أما الكائن البسيط فلا يمتلك المعلومات الكافية ليضع نفسه في المكان الصحيح نسبة إلى كائنات الوقت أو التاريخ الأخرى. تعتمد القيمة التي يمثّلها الكائن البسيط، سواء أكانت التوقيت العالمي المنسق (Coordinated Universal Time UTC) أو التوقيت المحلي، أو التوقيت في منطقة زمنية أخرى، تعتمد هذه القيمة بصورة تامة على البرنامج، كما يحدّد البرنامج هو المسؤول الوحيد عن تمثيل رقم معيّن للأمتار أو الأميال أو الكتلة.
إنّ العمل على الكائنات البسيطة وفهمها أمر سهل للغاية، ولكن على حساب تجاهل بعض الجوانب الواقعية.
إن كان التطبيق يتطلب استخدام الكائنات الواعية، فإنّ الكائنين datetime
و time
يمتلكان خاصية لتعيين المنطقة الزمنية، tzinfo
، والتي يمكن تعيينها كنسخة صنف فرعي من الصنف المجرّد tzinfo
. تجمع كائنات tzinfo
المعلومات المتعلقة بمقدار الإزاحة عن التوقيت العالمي المنسّق واسم المنطقة الزمنية والتوقيت الصيفي.
تدعم الوحدة datetime
الصنف timezone
فقط، والذي يمكن أن يمثل مناطق زمنيّة ذات إزاحة ثابتة عن التوقيت العالمي المنسق، مثل التوقيت العالمي نفسه أو توقيت شمال أمريكا EST و EDT. تحدد التطبيقات طبيعة المعلومات المتوفّرة عن كل منطقة زمنية، وقواعد تعديل الوقت حول العالم تخضع لضوابط سياسية أكثر منها منطقية وهي عرضة للتغيير باستمرار، ولا يوجد معيار ملائم لجميع التطبيقات باستثناء التوقيت العالمي المنسق.
أنواع البيانات في وحدة datetime
تقدم وحدة datetime أنواع البيانات التالية:
الصنف datetime.date
هو كائن وقت بسيط، ويتفرض أنّ التقويم الميلادي هو المستخدم للتعبير عن التاريخ، ويضمّ هذا الصنف الخصائص: year
و month
و day
.
from datetime import date
>>> now = date.today()
>>> now.day
24
>>> now.year
2018
>>> now.month
3
الصنف datetime.time
يمثّل هذا الكائن الوقت وهو مستقلّ عن الأيام، ويفترض أنّ كل يوم يمتدّ 24*60*60
ثانية، ويضم الخصائص التالية: hour
و minute
و second
و microsecond
و tzinfo
.
>> from datetime import time
>>> time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes')
'12:34'
الصنف datetime.datetime
يمثّل هذا الصنف مزيجًا بين الصنفين date
و time
، ويضمّ الخصائص التالية: year
و month
و day
و hour
و minute
و second
و microsecond
و tzinfo
.
>>>from datetime import datetime
>>> datetime.now().isoformat(timespec='minutes')
'2002-12-25T00:00'
>>> dt = datetime(2015, 1, 1, 12, 30, 59, 0)
>>> dt.isoformat(timespec='microseconds')
'2015-01-01T12:30:59.000000'
الصنف datetime.timedelta
هو عبارة عن فترة زمنية تمثّل الفرق بين نسختين لصنفي date
أو time
أو datetime
وبدقّة تصل إلى أجزاء الثانية.
>>> from datetime import timedelta
>>> year = timedelta(days=365)
>>> another_year = timedelta(weeks=40, days=84, hours=23, minutes=50, seconds=600) # المجموعة 365 يومًا
>>> year.total_seconds()
31536000.0
>>> year == another_year
True
>>> ten_years = 10 * year
>>> ten_years, ten_years.days // 365
(datetime.timedelta(3650), 10)
>>> nine_years = ten_years - year
>>> nine_years, nine_years.days // 365
(datetime.timedelta(3285), 9)
>>> three_years = nine_years // 3;
>>> three_years, three_years.days // 365
(datetime.timedelta(1095), 3)
>>> abs(three_years - ten_years) == 2 * three_years + year
True
الصنف datetime.tzinfo
صنف مجرّد أساسي يختصّ بالمعلومات المرتبطة بالمناطق الزمنية والتي تستخدم من طرف الأصناف datetime
و time
لعرض الوقت والتاريخ حسب المنطقة الزمنية أو مع مراعاة التوقيت الصيفي.
لصنف datetime.timezone
وهو صنف يستخدم الصنف المجرد الأساسي tzinfo
كإزاحة ثابتة عن التوقيت العالمي المنسّق UTC.
التابعان strftime()
و strptime()
تدعم كائنات date و datetime و time التابع strftime() والذي يُنشئ سلسلة نصية تتضمّن التاريخ الذي يجري التعامل معه. أما التابع strptime()
فتنشئ كائن datetime
من سلسلة نصية تمثّل الوقت والتاريخ بواسطة علامات تنسيق خاصة.
يجب عدم استخدام علامات التنسيق الخاصة بالسنة والشهر واليوم مع كائنات time
، وفي حال استخدامها تأخذ السنة القيمة 1900
ويأخذ الشهر واليوم القيمة 1
.
كذلك يجب عدم استخدام علامات التنسيق الخاصة بالساعة والدقيقة والثانية وجزء الثانية مع كائنات date
، وفي حال استخدامها تأخذ جميعها القيمة 0
.