الفرق بين المراجعتين لصفحة: «Python/datetime»
أنشأ الصفحة ب'تقدّم وحدة <code>datetime</code> عددًا من الأصناف التي تعالج التاريخ والوقت بطرق مبسّطة وأخرى معقدة، و...' |
لا ملخص تعديل |
||
(7 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:الوقت والتاريخ في بايثون}}</noinclude> | |||
تقدّم وحدة <code>datetime</code> عددًا من الأصناف التي تعالج التاريخ والوقت بطرق مبسّطة وأخرى معقدة، وتدعم بايثون إجراء العمليات الحسابية على التواريخ والأوقات.<syntaxhighlight lang="python3"> | تقدّم وحدة <code>datetime</code> عددًا من الأصناف التي تعالج التاريخ والوقت بطرق مبسّطة وأخرى معقدة، وتدعم بايثون إجراء العمليات الحسابية على التواريخ والأوقات.<syntaxhighlight lang="python3"> | ||
>>> from datetime import date | >>> from datetime import date | ||
سطر 12: | سطر 13: | ||
>>> age.days | >>> age.days | ||
14368 | 14368 | ||
</syntaxhighlight>هناك نوعان من كائنات الوقت والتاريخ: " | </syntaxhighlight> | ||
__TOC__ | |||
هناك نوعان من كائنات الوقت والتاريخ: "الواعي aware" و "البسيط naive" . | |||
يمتلك الكائن الواعي معرفة كافية بالعمليات الحسابية والتعديلات الدولية على الأوقات، كالمناطق الزمنية والتوقيت الصيفي، وتعديل القيمة الخاصّة به بصورة تتناسب مع الكائنات الواعية الأخرى. يستخدم الكائن الواعي لتمثيل فترة زمنية معيّنة غير مفتوحة للتفسير. | يمتلك الكائن الواعي معرفة كافية بالعمليات الحسابية والتعديلات الدولية على الأوقات، كالمناطق الزمنية والتوقيت الصيفي، وتعديل القيمة الخاصّة به بصورة تتناسب مع الكائنات الواعية الأخرى. يستخدم الكائن الواعي لتمثيل فترة زمنية معيّنة غير مفتوحة للتفسير. | ||
أما الكائن البسيط فلا يمتلك المعلومات الكافية ليضع نفسه في المكان الصحيح نسبة إلى كائنات الوقت أو التاريخ الأخرى. تعتمد القيمة التي يمثّلها الكائن | أما الكائن البسيط فلا يمتلك المعلومات الكافية ليضع نفسه في المكان الصحيح نسبة إلى كائنات الوقت أو التاريخ الأخرى. تعتمد القيمة التي يمثّلها الكائن البسيط. | ||
عندما يستخدم برنامج عددًا معيّنًا فإنّ ما يمثّله هذا العدد يُحدّد بواسطة البرنامج، فقد يمثّل العدد كتلة أو مسافة بالأمتار أو الأميال، وكذلك الأمر بالنسبة إلى كائنات الوقت والتاريخ البسيطة، فسواء أكان الكائن يصف التوقيت العالمي المنسق (Universal Coordinated Time يعرف اختصارًا UTC) أو التوقيت المحلي، أو التوقيت في منطقة زمنية أخرى، فإنّ ما يمثّله الكائن أو يصفه هو مسؤولية البرنامج فقط. | |||
إنّ العمل على الكائنات البسيطة وفهمها أمر سهل للغاية، ولكن على حساب تجاهل بعض الجوانب الواقعية. | إنّ العمل على الكائنات البسيطة وفهمها أمر سهل للغاية، ولكن على حساب تجاهل بعض الجوانب الواقعية. | ||
إن كان التطبيق يتطلب استخدام الكائنات الواعية، فإنّ الكائنين <code>datetime</code> و <code>time</code> يمتلكان | إن كان التطبيق يتطلب استخدام الكائنات الواعية، فإنّ الكائنين <code>datetime</code> و <code>time</code> يمتلكان الخاصية <code>tzinfo</code> ووظيفتها تعيين المنطقة الزمنية كنسخة صنف فرعي من الصنف المجرّد <code>tzinfo</code>. تجمع كائنات <code>tzinfo</code> المعلومات المتعلقة بمقدار الإزاحة عن التوقيت العالمي المنسّق واسم المنطقة الزمنية والتوقيت الصيفي. | ||
تدعم الوحدة <code>datetime</code> الصنف <code>timezone</code> فقط، والذي يمكن أن يمثل مناطق زمنيّة ذات إزاحة ثابتة عن التوقيت العالمي المنسق، مثل التوقيت العالمي نفسه أو توقيت شمال أمريكا EST و EDT. تحدد التطبيقات طبيعة المعلومات المتوفّرة عن كل منطقة زمنية، وقواعد تعديل الوقت حول العالم تخضع | تدعم الوحدة <code>datetime</code> الصنف <code>timezone</code> فقط، والذي يمكن أن يمثل مناطق زمنيّة ذات إزاحة ثابتة عن التوقيت العالمي المنسق، مثل التوقيت العالمي نفسه أو توقيت شمال أمريكا EST و EDT. تحدد التطبيقات طبيعة المعلومات المتوفّرة عن كل منطقة زمنية، وقواعد تعديل الوقت حول العالم تخضع لظروف سياسية أكثر منها منطقية وهي عرضة للتغيير باستمرار، ولا يوجد معيار ملائم لجميع التطبيقات باستثناء التوقيت العالمي المنسق. | ||
== أنواع البيانات في وحدة datetime == | == أنواع البيانات في وحدة datetime == | ||
تقدم وحدة datetime أنواع البيانات التالية: | تقدم وحدة <code>datetime</code> أنواع البيانات التالية: | ||
=== الصنف datetime.date === | === [[Python/datetime/date|الصنف <code>datetime.date</code>]] === | ||
يمثّل هذا الصنف التاريخ بصيغة مثالية وهو من النوع البسيط، ويفترض أنّ التقويم الميلادي هو المستخدم للتعبير عن التاريخ، ويضمّ هذا الصنف الخصائص: <code>year</code> و <code>month</code> و <code>day</code>.<syntaxhighlight lang="python3"> | |||
from datetime import date | from datetime import date | ||
>>> now = date.today() | >>> now = date.today() | ||
سطر 39: | سطر 46: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== الصنف datetime.time === | === [[Python/datetime/time|الصنف <code>datetime.time</code>]] === | ||
يمثّل هذا | يمثّل هذا الصنف الوقت وهو مستقلّ عن الأيام، ويفترض أنّ كل يوم يمتدّ <code>24*60*60</code> ثانية، ويضم الخصائص التالية: <code>hour</code> و <code>minute</code> و <code>second</code> و <code>microsecond</code> و <code>tzinfo</code>.<syntaxhighlight lang="python3"> | ||
>> from datetime import time | >> from datetime import time | ||
>>> time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes') | >>> time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes') | ||
سطر 46: | سطر 53: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== الصنف datetime.datetime === | === [[Python/datetime/datetime|الصنف <code>datetime.datetime</code>]] === | ||
يمثّل هذا الصنف مزيجًا بين الصنفين <code>date</code> و <code>time</code>، ويضمّ الخصائص التالية: <code>year</code> و <code>month</code> و <code>day</code> و <code>hour</code> و <code>minute</code> و <code>second</code> و <code>microsecond</code> و <code>tzinfo</code>.<syntaxhighlight lang="python3"> | يمثّل هذا الصنف مزيجًا بين الصنفين <code>date</code> و <code>time</code>، ويضمّ الخصائص التالية: <code>year</code> و <code>month</code> و <code>day</code> و <code>hour</code> و <code>minute</code> و <code>second</code> و <code>microsecond</code> و <code>tzinfo</code>.<syntaxhighlight lang="python3"> | ||
>>>from datetime import datetime | >>>from datetime import datetime | ||
سطر 56: | سطر 63: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== الصنف datetime.timedelta === | === [[Python/datetime/timedelta|الصنف <code>datetime.timedelta</code>]] === | ||
هو عبارة عن | هو عبارة عن مدّة زمنية تمثّل الفرق بين نسختين لصنفي <code>date</code> أو <code>time</code> أو <code>datetime</code> وبدقّة تصل إلى أجزاء الثانية. | ||
<syntaxhighlight lang="python3"> | <syntaxhighlight lang="python3"> | ||
>>> from datetime import timedelta | >>> from datetime import timedelta | ||
>>> year = timedelta(days=365) | >>> year = timedelta(days=365) | ||
>>> another_year = timedelta(weeks=40, days=84, hours=23, minutes=50, seconds=600) # | >>> another_year = timedelta(weeks=40, days=84, hours=23, minutes=50, seconds=600) # المجموع 365 يومًا | ||
>>> year.total_seconds() | >>> year.total_seconds() | ||
31536000.0 | 31536000.0 | ||
سطر 80: | سطر 87: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== الصنف datetime.tzinfo === | === [[Python/datetime/tzinfo|الصنف <code>datetime.tzinfo</code>]] === | ||
صنف مجرّد أساسي يختصّ بالمعلومات المرتبطة بالمناطق الزمنية والتي تستخدم من طرف الأصناف <code>datetime</code> و <code>time</code> لعرض الوقت والتاريخ حسب المنطقة الزمنية أو مع مراعاة التوقيت الصيفي. | صنف مجرّد أساسي يختصّ بالمعلومات المرتبطة بالمناطق الزمنية والتي تستخدم من طرف الأصناف <code>datetime</code> و <code>time</code> لعرض الوقت والتاريخ حسب المنطقة الزمنية أو مع مراعاة التوقيت الصيفي. | ||
=== | === [[Python/datetime/timezone|الصنف <code>datetime.timezone</code>]] === | ||
وهو صنف يستخدم الصنف المجرد الأساسي <code>tzinfo</code> كإزاحة ثابتة عن التوقيت العالمي المنسّق UTC. | وهو صنف يستخدم الصنف المجرد الأساسي <code>tzinfo</code> كإزاحة ثابتة عن التوقيت العالمي المنسّق UTC. | ||
ترتبط هذه الأصناف ببعضها البعض حسب المخطط التالي:<syntaxhighlight lang="text"> | |||
object | |||
timedelta | |||
tzinfo | |||
timezone | |||
time | |||
date | |||
datetime | |||
</syntaxhighlight> | |||
== التابعان <code>strftime()</code> و <code>strptime()</code> == | == التابعان <code>strftime()</code> و <code>strptime()</code> == | ||
تدعم كائنات date و datetime و time التابع strftime() والذي يُنشئ سلسلة نصية تتضمّن التاريخ الذي يجري التعامل معه. أما التابع <code>strptime()</code> | تدعم كائنات <code>date</code> و <code>datetime</code> و <code>time</code> التابع <code>strftime()</code> والذي يُنشئ [[Python/str|سلسلة نصية]] تتضمّن التاريخ الذي يجري التعامل معه. أما التابع <code>strptime()</code> فينشئ كائن <code>datetime</code> من [[Python/str|سلسلة نصية]] تمثّل الوقت والتاريخ بواسطة علامات تنسيق خاصة يوضّحها الجدول التالي. | ||
يجب عدم استخدام علامات التنسيق الخاصة بالسنة والشهر واليوم مع كائنات <code>time</code>، وفي حال استخدامها تأخذ السنة القيمة <code>1900</code> ويأخذ الشهر واليوم القيمة <code>1</code>. | يجب عدم استخدام علامات التنسيق الخاصة بالسنة والشهر واليوم مع كائنات <code>time</code>، وفي حال استخدامها تأخذ السنة القيمة <code>1900</code> ويأخذ الشهر واليوم القيمة <code>1</code>. | ||
كذلك يجب عدم استخدام علامات التنسيق الخاصة بالساعة والدقيقة والثانية وجزء الثانية مع كائنات <code>date</code>، وفي حال استخدامها تأخذ جميعها القيمة <code>0</code>. | كذلك يجب عدم استخدام علامات التنسيق الخاصة بالساعة والدقيقة والثانية وجزء الثانية مع كائنات <code>date</code>، وفي حال استخدامها تأخذ جميعها القيمة <code>0</code>. | ||
{| class="wikitable" | |||
!الموجه | |||
!المعنى | |||
!مثال | |||
!ملاحظات | |||
|- | |||
|<code>%a</code> | |||
|الاسم المختصر لليوم حسب الإعدادات المحلية. | |||
|Sun, Mon, …, Sat (en_US) | |||
So, Mo, …, Sa (de_DE) | |||
|(1) | |||
|- | |||
|<code>%A</code> | |||
|الاسم الكامل لليوم حسب الإعدادات المحلية. | |||
|Sunday, Monday, …, Saturday (en_US)، | |||
Sonntag, Montag, …, Samstag (de_DE) | |||
|(1) | |||
|- | |||
|<code>%w</code> | |||
|اليوم كعدد عشري، يمثل الرقم <code>0</code> يوم الأحد والرقم <code>6</code> يوم السبت. | |||
|<code>6, ..., 1, 0</code> | |||
| | |||
|- | |||
|<code>%d</code> | |||
|اليوم في الشهر كعدد عشري يسبقه <code>0</code>. | |||
|<code>31, ..., 02, 01</code> | |||
| | |||
|- | |||
|<code>%b</code> | |||
|الاسم المختصر للشهر حسب الإعدادات المحلية. | |||
|Jan, Feb, …, Dec (en_US)، | |||
Jan, Feb, …, Dez (de_DE) | |||
|(1) | |||
|- | |||
|<code>%B</code> | |||
|الاسم الكامل للشهر حسب الإعدادات المحلية. | |||
|January, February, …, December (en_US)، | |||
Januar, Februar, …, Dezember (de_DE) | |||
|(1) | |||
|- | |||
|<code>%m</code> | |||
|الشهر كعدد عشري يسبقه <code>0</code>. | |||
|<code>12, ..., 02, 01</code> | |||
| | |||
|- | |||
|<code>%y</code> | |||
|الصيغة المختصرة للسنة (مرتبتا الآحاد والعشرات فقط دون ذكر القرن الحالي). | |||
|<code>99, ..., 02, 01</code> | |||
| | |||
|- | |||
|<code>%Y</code> | |||
|الصيغة الكاملة للسنة (مع ذكر القرن الحالي). | |||
|<code>9999, 9998, ...., 2018, 2017, ...., 0002, 0001</code> | |||
|(2) | |||
|- | |||
|<code>%H</code> | |||
|الساعة كعدد عشري (بنظام 24 ساعة) يسبقه <code>0</code>. | |||
|<code>23, ..., 01, 00</code> | |||
| | |||
|- | |||
|<code>%I</code> | |||
|الساعة كعدد عشري (بنظام 12 ساعة) يسبقه <code>0</code>. | |||
|<code>12, ..., 02, 01</code> | |||
| | |||
|- | |||
|<code>%p</code> | |||
|ما يكافئ AM (قبل الظهر) و PM (بعد الظهر) في الإعدادات المحلية. | |||
|AM, PM (en_US)، | |||
am, pm (de_DE) | |||
|(3) و (1) | |||
|- | |||
|<code>%M</code> | |||
|الدقائق كعدد عشري يسبقه <code>0</code>. | |||
|<code>59, ..., 01, 00</code> | |||
| | |||
|- | |||
|<code>%S</code> | |||
|الثواني كعدد عشري يسبقه <code>0</code>. | |||
|<code>59, ..., 01, 00</code> | |||
|(4) | |||
|- | |||
|<code>%f</code> | |||
|أجزاء الثانية كعدد عشري تسبقه الأصفار من جهة اليسار. | |||
|<code>999999, ..., 000001, 000000</code> | |||
|(5) | |||
|- | |||
|<code>%z</code> | |||
|الإزاحة من التوقيت العالمي المنسق UTC بالصيغة +HHMM أو -HHMM ([[Python/str|سلسلة نصية]] فارغة إن كان الكائن بسيطًا naive). | |||
|<code>(empty), +0000, -0400, +1300</code> | |||
|(6) | |||
|- | |||
|<code>%Z</code> | |||
|اسم المنطقة الزمنية ([[Python/str|سلسلة نصية]] فارغة كان الكائن بسيطًا) | |||
|<code>(empty), UTC, EST, CST</code> | |||
| | |||
|- | |||
|<code>%j</code> | |||
|اليوم في السنة كعدد عشري تسبقه الأصفار. | |||
|<code>366, ..., 002, 001</code> | |||
| | |||
|- | |||
|<code>%U</code> | |||
|رقم الأسبوع في السنة (يوم الأحد هو اليوم الأول في الأسبوع) كعدد عشري تسبقه الأصفار. تعدّ جميع الأيام التي تسبق أوّل يوم أحد في السنة الجديدة ضمن الأسبوع <code>0</code>. | |||
|<code>53, ..., 02, 01</code> | |||
|(7) | |||
|- | |||
|<code>%W</code> | |||
|رقم الأسبوع في السنة (يوم الاثنين هو اليوم الأول في الأسبوع) كعدد عشري تسبقه الأصفار. تعدّ جميع الأيام التي تسبق أوّل يوم اثنين في السنة الجديدة ضمن الأسبوع <code>0</code>. | |||
|<code>53, ..., 02, 01</code> | |||
|(7) | |||
|- | |||
|<code>%c</code> | |||
|التمثيل المناسب للتاريخ والوقت حسب الإعدادات المحلية. | |||
|Tue Aug 16 21:30:00 1988 (en_US)، | |||
Di 16 Aug 21:30:00 1988 (de_DE) | |||
|(1) | |||
|- | |||
|<code>%x</code> | |||
|التمثيل المناسب للتاريخ حسب الإعدادات المحلية. | |||
|08/16/88 (None)، | |||
08/16/1988 (en_US)، | |||
16.08.1988 (de_DE) | |||
|(1) | |||
|- | |||
|<code>%X</code> | |||
|التمثيل المناسب للوقت حسب الإعدادات المحلية. | |||
|21:30:00 (en_US)، | |||
21:30:00 (de_DE) | |||
|(1) | |||
|- | |||
|<code>%%</code> | |||
|الحرف <code>%</code>. | |||
|% | |||
|} | |||
'''الملاحظات:''' | |||
# يعتمد تنسيق السلسلة النصية على الإعدادات المحلية لنظام التشغيل، ونظرًا لذلك يجب الانتباه إلى هذا الأمر عند عرض المخرجات. فقد يتغير ترتيب الحقول (مثلًا: الشهر/اليوم/السنة مقابل اليوم/الشهر/السنة) وقد تتضمن المخرجات حروف يونيكود وتستخدم الترميز الافتراضي المحلي (مثلًا، إن كانت الإعدادات المحلية هي <code>ja_JP</code> فإنّ الترميز الافتراضي سيكون إمّا <code>eucJP</code> أو <code>SJIS</code> أو <code>utf-8</code>. يمكن استخدام التابع <code>locale.getlocale()</code> لتحديد ترميز الإعداد المحلية). | |||
# يمكن للتابع <code>strptime()</code> أن يتعامل مع السنوات بصيغتها الكاملة [<code>1, 9999</code>] ولكن يجب إضافة الأصفار إلى يسار رقم السنة إن كانت أقل من <code>1000</code>. '''تغيير في الإصدار 3.2:''' كان التابع <code>strftime()</code> في الإصدارات السابقة مقيدًا بالسنة التي تتجاوز أو تساوي <code>1900</code>. '''تغيير في الإصدار 3.3:''' كان التابع في الإصدار 3.2 مقيدًا بالسنة التي تتجاوز أو تساوي <code>1000</code>. | |||
# عند استخدام الموجّه <code>%p</code> مع التابع <code>strptime()</code> فإنّه يؤثّر على حقل الساعة فقط في المخرجات إن كان الموجّه <code>%I</code> مستخدمًا لعرض الساعة. | |||
# وحدة <code>datetime</code> وعلى العكس من وحدة <code>time</code> لا تدعم الثواني الكبيسة. | |||
# عند استخدام الموجّه <code>%f</code> مع التابع <code>strptime()</code> فإنّه يقبل الأعداد من مرتبة واحدة إلى ست مراتب مع إضافة الأصفار إلى اليمين. | |||
# بالنسبة للكائنات البسيطة يحلّ محل الموجّهين <code>%z</code> و <code>%Z</code> [[Python/str|سلسلة نصية]]. أما بالنسبة للكائنات الواعية: عند استخدام الموجّه <code>%z</code>: تحوّل قيمة <code>utcoffset()</code> إلى [[Python/str|سلسلة نصية]] ذات 5 أحرف على هيئة +HHMM أو -HHMM إذ تمثل <code>HH</code> [[Python/str|سلسلة نصية]] ذات حرفين فيها عدد ساعات الإزاحة عن UTC وتمثّل <code>MM</code> سلسلة نصية ذات حرفين فيها عدد دقائق الإزاحة عن UTC. فمثلًا لو أعاد التابع <code>utcoffset()</code> القيمة <code>timedelta(hours=-3, minutes=-30)</code> فإنّ السلسلة النصية <code>'-0330'</code> ستحلّ محل الموجه <code>%z</code>. عند استخدام الموجّه <code>%Z</code>: إن أعاد التابع <code>tzname()</code> القيمة <code>None</code> فإنّ [[Python/str|سلسلة نصية]] تحلّ محلّ الموجّه <code>%Z</code>. وإلا فإنّ القيمة المعادة (والتي يجب أن تكون [[Python/str|سلسلة نصية]]) ستحلّ محلّ الموجّه. '''تغيير في الإصدار 3.2:''' ينتج عن تقديم الموجه <code>%z</code> إلى التابع <code>strptime()</code> كائن <code>datetime</code> واعٍ، وستعيّن <code>tzinfo</code> في النتيجة المستحصلة إلى نسخة <code>timezone</code>. | |||
# عند استخدام الموجّهين <code>%U</code> و <code>%W</code> في التابع <code>strptime()</code> فإنّهما لا يدخلان في الحسابات إلا إذا عيّن اليوم في الأسبوع والسنة (<code>%Y</code>). | |||
== مصادر == | |||
* صفحة [https://docs.python.org/3/library/datetime.html#module-datetime Basic date and time types] في تويثق بايثون الرسمي. | |||
[[تصنيف:Python]] | [[تصنيف:Python]] | ||
[[تصنيف:Python Date and Time]] | [[تصنيف:Python Date and Time]] |
المراجعة الحالية بتاريخ 12:06، 16 سبتمبر 2021
تقدّم وحدة 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
هناك نوعان من كائنات الوقت والتاريخ: "الواعي aware" و "البسيط naive" .
يمتلك الكائن الواعي معرفة كافية بالعمليات الحسابية والتعديلات الدولية على الأوقات، كالمناطق الزمنية والتوقيت الصيفي، وتعديل القيمة الخاصّة به بصورة تتناسب مع الكائنات الواعية الأخرى. يستخدم الكائن الواعي لتمثيل فترة زمنية معيّنة غير مفتوحة للتفسير.
أما الكائن البسيط فلا يمتلك المعلومات الكافية ليضع نفسه في المكان الصحيح نسبة إلى كائنات الوقت أو التاريخ الأخرى. تعتمد القيمة التي يمثّلها الكائن البسيط.
عندما يستخدم برنامج عددًا معيّنًا فإنّ ما يمثّله هذا العدد يُحدّد بواسطة البرنامج، فقد يمثّل العدد كتلة أو مسافة بالأمتار أو الأميال، وكذلك الأمر بالنسبة إلى كائنات الوقت والتاريخ البسيطة، فسواء أكان الكائن يصف التوقيت العالمي المنسق (Universal Coordinated 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.
ترتبط هذه الأصناف ببعضها البعض حسب المخطط التالي:
object
timedelta
tzinfo
timezone
time
date
datetime
التابعان strftime()
و strptime()
تدعم كائنات date
و datetime
و time
التابع strftime()
والذي يُنشئ سلسلة نصية تتضمّن التاريخ الذي يجري التعامل معه. أما التابع strptime()
فينشئ كائن datetime
من سلسلة نصية تمثّل الوقت والتاريخ بواسطة علامات تنسيق خاصة يوضّحها الجدول التالي.
يجب عدم استخدام علامات التنسيق الخاصة بالسنة والشهر واليوم مع كائنات time
، وفي حال استخدامها تأخذ السنة القيمة 1900
ويأخذ الشهر واليوم القيمة 1
.
كذلك يجب عدم استخدام علامات التنسيق الخاصة بالساعة والدقيقة والثانية وجزء الثانية مع كائنات date
، وفي حال استخدامها تأخذ جميعها القيمة 0
.
الموجه | المعنى | مثال | ملاحظات |
---|---|---|---|
%a
|
الاسم المختصر لليوم حسب الإعدادات المحلية. | Sun, Mon, …, Sat (en_US)
So, Mo, …, Sa (de_DE) |
(1) |
%A
|
الاسم الكامل لليوم حسب الإعدادات المحلية. | Sunday, Monday, …, Saturday (en_US)،
Sonntag, Montag, …, Samstag (de_DE) |
(1) |
%w
|
اليوم كعدد عشري، يمثل الرقم 0 يوم الأحد والرقم 6 يوم السبت.
|
6, ..., 1, 0
|
|
%d
|
اليوم في الشهر كعدد عشري يسبقه 0 .
|
31, ..., 02, 01
|
|
%b
|
الاسم المختصر للشهر حسب الإعدادات المحلية. | Jan, Feb, …, Dec (en_US)،
Jan, Feb, …, Dez (de_DE) |
(1) |
%B
|
الاسم الكامل للشهر حسب الإعدادات المحلية. | January, February, …, December (en_US)،
Januar, Februar, …, Dezember (de_DE) |
(1) |
%m
|
الشهر كعدد عشري يسبقه 0 .
|
12, ..., 02, 01
|
|
%y
|
الصيغة المختصرة للسنة (مرتبتا الآحاد والعشرات فقط دون ذكر القرن الحالي). | 99, ..., 02, 01
|
|
%Y
|
الصيغة الكاملة للسنة (مع ذكر القرن الحالي). | 9999, 9998, ...., 2018, 2017, ...., 0002, 0001
|
(2) |
%H
|
الساعة كعدد عشري (بنظام 24 ساعة) يسبقه 0 .
|
23, ..., 01, 00
|
|
%I
|
الساعة كعدد عشري (بنظام 12 ساعة) يسبقه 0 .
|
12, ..., 02, 01
|
|
%p
|
ما يكافئ AM (قبل الظهر) و PM (بعد الظهر) في الإعدادات المحلية. | AM, PM (en_US)،
am, pm (de_DE) |
(3) و (1) |
%M
|
الدقائق كعدد عشري يسبقه 0 .
|
59, ..., 01, 00
|
|
%S
|
الثواني كعدد عشري يسبقه 0 .
|
59, ..., 01, 00
|
(4) |
%f
|
أجزاء الثانية كعدد عشري تسبقه الأصفار من جهة اليسار. | 999999, ..., 000001, 000000
|
(5) |
%z
|
الإزاحة من التوقيت العالمي المنسق UTC بالصيغة +HHMM أو -HHMM (سلسلة نصية فارغة إن كان الكائن بسيطًا naive). | (empty), +0000, -0400, +1300
|
(6) |
%Z
|
اسم المنطقة الزمنية (سلسلة نصية فارغة كان الكائن بسيطًا) | (empty), UTC, EST, CST
|
|
%j
|
اليوم في السنة كعدد عشري تسبقه الأصفار. | 366, ..., 002, 001
|
|
%U
|
رقم الأسبوع في السنة (يوم الأحد هو اليوم الأول في الأسبوع) كعدد عشري تسبقه الأصفار. تعدّ جميع الأيام التي تسبق أوّل يوم أحد في السنة الجديدة ضمن الأسبوع 0 .
|
53, ..., 02, 01
|
(7) |
%W
|
رقم الأسبوع في السنة (يوم الاثنين هو اليوم الأول في الأسبوع) كعدد عشري تسبقه الأصفار. تعدّ جميع الأيام التي تسبق أوّل يوم اثنين في السنة الجديدة ضمن الأسبوع 0 .
|
53, ..., 02, 01
|
(7) |
%c
|
التمثيل المناسب للتاريخ والوقت حسب الإعدادات المحلية. | Tue Aug 16 21:30:00 1988 (en_US)،
Di 16 Aug 21:30:00 1988 (de_DE) |
(1) |
%x
|
التمثيل المناسب للتاريخ حسب الإعدادات المحلية. | 08/16/88 (None)،
08/16/1988 (en_US)، 16.08.1988 (de_DE) |
(1) |
%X
|
التمثيل المناسب للوقت حسب الإعدادات المحلية. | 21:30:00 (en_US)،
21:30:00 (de_DE) |
(1) |
%%
|
الحرف % .
|
% |
الملاحظات:
- يعتمد تنسيق السلسلة النصية على الإعدادات المحلية لنظام التشغيل، ونظرًا لذلك يجب الانتباه إلى هذا الأمر عند عرض المخرجات. فقد يتغير ترتيب الحقول (مثلًا: الشهر/اليوم/السنة مقابل اليوم/الشهر/السنة) وقد تتضمن المخرجات حروف يونيكود وتستخدم الترميز الافتراضي المحلي (مثلًا، إن كانت الإعدادات المحلية هي
ja_JP
فإنّ الترميز الافتراضي سيكون إمّاeucJP
أوSJIS
أوutf-8
. يمكن استخدام التابعlocale.getlocale()
لتحديد ترميز الإعداد المحلية). - يمكن للتابع
strptime()
أن يتعامل مع السنوات بصيغتها الكاملة [1, 9999
] ولكن يجب إضافة الأصفار إلى يسار رقم السنة إن كانت أقل من1000
. تغيير في الإصدار 3.2: كان التابعstrftime()
في الإصدارات السابقة مقيدًا بالسنة التي تتجاوز أو تساوي1900
. تغيير في الإصدار 3.3: كان التابع في الإصدار 3.2 مقيدًا بالسنة التي تتجاوز أو تساوي1000
. - عند استخدام الموجّه
%p
مع التابعstrptime()
فإنّه يؤثّر على حقل الساعة فقط في المخرجات إن كان الموجّه %I
مستخدمًا لعرض الساعة. - وحدة
datetime
وعلى العكس من وحدةtime
لا تدعم الثواني الكبيسة. - عند استخدام الموجّه
%f
مع التابعstrptime()
فإنّه يقبل الأعداد من مرتبة واحدة إلى ست مراتب مع إضافة الأصفار إلى اليمين. - بالنسبة للكائنات البسيطة يحلّ محل الموجّهين
%z
و%Z
سلسلة نصية. أما بالنسبة للكائنات الواعية: عند استخدام الموجّه%z
: تحوّل قيمةutcoffset()
إلى سلسلة نصية ذات 5 أحرف على هيئة +HHMM أو -HHMM إذ تمثلHH
سلسلة نصية ذات حرفين فيها عدد ساعات الإزاحة عن UTC وتمثّلMM
سلسلة نصية ذات حرفين فيها عدد دقائق الإزاحة عن UTC. فمثلًا لو أعاد التابعutcoffset()
القيمةtimedelta(hours=-3, minutes=-30)
فإنّ السلسلة النصية'-0330'
ستحلّ محل الموجه%z
. عند استخدام الموجّه%Z
: إن أعاد التابعtzname()
القيمةNone
فإنّ سلسلة نصية تحلّ محلّ الموجّه%Z
. وإلا فإنّ القيمة المعادة (والتي يجب أن تكون سلسلة نصية) ستحلّ محلّ الموجّه. تغيير في الإصدار 3.2: ينتج عن تقديم الموجه%z
إلى التابعstrptime()
كائنdatetime
واعٍ، وستعيّنtzinfo
في النتيجة المستحصلة إلى نسخةtimezone
. - عند استخدام الموجّهين
%U
و%W
في التابعstrptime()
فإنّهما لا يدخلان في الحسابات إلا إذا عيّن اليوم في الأسبوع والسنة (%Y
).
مصادر
- صفحة Basic date and time types في تويثق بايثون الرسمي.