Python/datetime

من موسوعة حسوب
مراجعة 07:56، 24 مارس 2018 بواسطة Mohammed Taher (نقاش | مساهمات) (أنشأ الصفحة ب'تقدّم وحدة <code>datetime</code> عددًا من الأصناف التي تعالج التاريخ والوقت بطرق مبسّطة وأخرى معقدة، و...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

تقدّم وحدة 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.