تعلم البرمجة مع Python


الدرس: التعبير عن الوقت


الصفحة السابقة
يطرح التعبير عن الوقت في أجهزة الكمبيوتر بعض الأسئلة. يمكن أن يكون لوجود قياس الوقت في برنامج ما تطبيقات مختلفة: معرفة التاريخ والوقت الحاليين والإبلاغ عن الخطأ ، وحساب مدة تشغيل البرنامج ، وإدارة الإنذارات المبرمجة ، والتنفيذ الأداء… وهلم جرا!

هناك عدة طرق لتمثيل الأوقات ، سنكتشفها الآن.

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

وحدة الوقت



الوحدة time هي بلا شك أول وحدة يتم استخدامها عندما تريد التعامل مع الأوقات بطريقة بسيطة.

لاحظ أنه في وثائق المكتبة القياسية ، تم تصنيف هذه الوحدة ضمن خدمات نظام التشغيل العامة (أي الخدمات المشتركة لأنظمة التشغيل المختلفة). هذه ليست مصادفة:  time هي وحدة قريبة جدا من النظام. هذا يعني أن بعض وظائف هذه الوحدة قد يكون لها نتائج مختلفة على أنظمة مختلفة. من ناحيتي ، سأركز بشكل أساسي على الميزات الأكثر عمومية حتى لا أفقد أي شخص.

أدعوكم لمراجعة وثائق بيثون على المكتبة القياسية ، وعلى وحدة الزمن ، لمزيد من المعلومات.

تمثل التاريخ والوقت في رقم واحد


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

كيف يتم تمثيل التاريخ والوقت في عدد صحيح فريد؟

كانت الفكرة المعتمدة هي تمثيل التاريخ والوقت وفقًا لعدد الثواني المنقضية منذ تاريخ محدد. في معظم الأحيان ، يكون هذا التاريخ هو Epoch Unix1 يناير 1970 الساعة 12:00:00 صباحًا.

لماذا هذا التاريخ وليس آخر؟

كان علينا اختيار تاريخ البدء. كان يُنظر إلى عام 1970 على أنه بداية جيدة ، نظرًا لازدهار الحوسبة منذ ذلك الوقت. من ناحية أخرى ، يكون الكمبيوتر محدودًا حتما عندما يتعامل مع أعداد صحيحة ؛ في لغات ذلك الوقت ، كان من الضروري مراعاة هذه الحقيقة البسيطة جدًا: لا يمكن للمرء أن يعد عددًا كبيرًا من الثواني. لذلك لا يمكن إرجاع تاريخ الحقبة إلى الوراء في الوقت المناسب.

سنرى أولاً كيفية عرض هذا العدد الشهير من الثواني المنقضية منذ 1 يناير 1970 الساعة 00:00:00. نستخدم وظيفة time الوحدة time .


>>> import time
>>> time.time()
1297642146.562
>>>
 
هذا يصنع الكثير! من ناحية أخرى ، ضع في اعتبارك على أي حال أن هذا يمثل عدد الثواني التي انقضت لأكثر من أربعين عامًا حتى الآن.

الآن ، أعطيكم ، هذا الرقم ليس مفهوما جدا للإنسان. من ناحية أخرى ، بالنسبة لجهاز الكمبيوتر ، فهو مثالي: من السهل إضافة المدد المحسوبة بعدد الثواني ، والطرح ، والضرب ... باختصار ، يعمل الكمبيوتر بشكل أفضل بكثير مع هذا العدد من الثواني ، هذا الطابع الزمني  (timestamp)كما نسميه عادة.

قم باختبار بسيط: قم بتخزين القيمة التي تم إرجاعها time.time() في متغير أول ، ثم بعد بضع ثوانٍ قم بتخزين القيمة الجديدة التي تم إرجاعها time.time() في متغير آخر. قارنهم وطرحهم ، سترى أن ذلك يتم بمفرده:


>>> debut = time.time()
>>> # On attend quelques secondes avant de taper la commande suivante
... fin = time.time()
>>> print(debut, fin)
1297642195.45 1297642202.27
>>> debut < fin
True
>>> fin - debut # Combien de secondes entre debut et fin ?
6.812000036239624
>>>
 
قد تلاحظ أن القيمة التي  تم إرجاعها بواسطة time.time()ليست عددًا صحيحًا ، بل عددًا عشريًا. الوقت المعطى على هذا النحو أكثر دقة من ثانية واحدة. بالنسبة لحسابات الأداء ، لا يتم استخدام هذه الوظيفة بشكل عام. لكن هذا جيد بما يكفي في معظم الأوقات.

التاريخ والوقت بطريقة أفضل


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

سوف نستخدم وظيفة localtime للوحدة time .


time.localtime()
 
تقوم بإرجاع كائن يحتوي ، بالترتيب:

  1. tm_year : السنة كعدد صحيح ؛
  2. tm_mon : رقم الشهر (بين 1 و 12) ؛
  3. tm_mday : عدد أيام الشهر (بين 1 و 31 ، تختلف من شهر لآخر ومن سنة إلى أخرى) ؛
  4. tm_hour : الوقت من اليوم (بين 0 و 23) ؛
  5. tm_min : عدد الدقائق (بين 0 و 59) ؛
  6. tm_sec : عدد الثواني (بين 0 و 61 ، حتى لو استخدمنا القيم من 0 إلى 59 هنا ، هذا كافٍ تمامًا) ؛
  7. tm_wday : عدد صحيح يمثل يوم الأسبوع (بين 0 و 6 ، 0 يتوافق افتراضيًا مع يوم الاثنين) ؛
  8. tm_yday : يوم السنة بين 1 و 366 ؛
  9. tm_isdst : عدد صحيح يمثل تغيير التوقيت المحلي.
كما هو الحال دائمًا ، إذا كنت تريد معرفة المزيد ، فإني أحيلك إلى الوثائق الرسمية للوحدة time .

كما قلت أعلاه ، سنستخدم الوظيفة localtime . يتطلب الأمر معلمة اختيارية: الطابع الزمني كما اكتشفنا أعلاه. إذا لم يتم تحديد هذه المعلمة ، localtime فسيتم استخدامها تلقائيًا time.time() وبالتالي إرجاع التاريخ والوقت الحاليين.


>>> time.localtime()
time.struct_time(tm_year=2011, tm_mon=2, tm_mday=14, tm_hour=3, tm_min=22, tm_sec=7, tm_wday=0, tm_yday=45, tm_isdst=0)
>>> time.localtime(debut)
time.struct_time(tm_year=2011, tm_mon=2, tm_mday=14, tm_hour=1, tm_min=9, tm_sec=55, tm_wday=0, tm_yday=45, tm_isdst=0)
>>> time.localtime(fin)
time.struct_time(tm_year=2011, tm_mon=2, tm_mday=14, tm_hour=1, tm_min=10, tm_sec=2, tm_wday=0, tm_yday=45, tm_isdst=0)
>>>
 
لمعرفة ما يتوافق مع كل سمة من سمات الكائن ، أحيلك أعلى قليلاً. بالنسبة للجزء الأكبر ، من الواضح جدًا على ما أعتقد. على الرغم من كل شيء ، فإن التاريخ والوقت اللذين تم إرجاعهما ليسا مقروئين للغاية ميزة الحصول عليها في هذا النموذج هي أنه يمكنك بسهولة استخراج المعلومات إذا كنت بحاجة لها فقط ، على سبيل المثال ، السنة ورقم اليوم.

استرجع طابع زمني(timestamp) من تاريخ


سأقوم بتخطي هذه الميزة بشكل أسرع لأنه على الأرجح ستستخدمها بشكل أقل. الفكرة ، من هيكل يمثل التاريخ والوقت كما تم إرجاعهما localtime ، لاسترداد الطابع الزمني المقابل. للقيام بذلك ، نستخدم الوظيفة mktime .


>>> print(debut)
1297642195.45
>>> temps = time.localtime(debut)
>>> print(temps)
time.struct_time(tm_year=2011, tm_mon=2, tm_mday=14, tm_hour=1, tm_min=9, tm_sec=55, tm_wday=0, tm_yday=45, tm_isdst=0)
>>> ts_debut = time.mktime(temps)
>>> print(ts_debut)
1297642195.0
>>>
 

إيقاف تنفيذ البرنامج مؤقتًا لفترة محددة


هذه أيضًا ميزة رائعة ، على الرغم من أنك ربما لا ترى الحاجة إليها في البداية. الوظيفة التي نهتم بها هي sleep وتستغرق عددًا من الثواني كمعامل يمكن أن يكون في شكل عدد صحيح أو عدد عشري. لمعرفة التأثير ، أشجعكم على الاختبار بأنفسكم:


>>> time.sleep(3.5) # توقف لمدة 3.5 ثانية
>>>
 
كما ترى ، ستتوقف Python مؤقتًا وعليك الانتظار 3.5 ثانية قبل ظهور الثلاثة شيفرون مرة أخرى.

تنسيق الوقت


الآن دعونا نلقي نظرة على الدالة strftime . تسمح لك بتنسيق التاريخ والوقت من خلال تمثيلهما في سلسلة أحرف.

يتطلب معلمتين:

  • سلسلة التنسيق (سنرى كيفية تشكيلها أدناه).
  • وقت اختياري كما تم إرجاعه localtime . إذا لم يتم تحديد الوقت ، فسيتم استخدام التاريخ والوقت الحاليين بشكل افتراضي.
لبناء سلسلة التنسيق الخاصة بنا ، سنستخدم عدة أحرف خاصة. ستستبدل Python هذه الأحرف بقيمتها (قيمة الوقت المنقضي في المعلمة الثانية أو الوقت الحالي بخلاف ذلك).

مثال:


time.strftime('%Y')
 
فيما يلي جدول ملخص للرموز القليلة التي يمكنك استخدامها في هذه السلسلة:

الرمز المعنى
%A اسم يوم من الأسبوع
%B اسم الشهر
%d يوم من الشهر (من 01 إلى 31)
%H الساعة (من 00 إلى 23)
%M دقيقة (بين 00 و 59)
%S الثانية (من 00 إلى 59)
%Y عام
لعرض التاريخ كما اعتدنا:

time.strftime("%A %d %B %Y %H:%M:%S")
 

العديد من الوظائف الأخرى


Time تقدم الوحدة العديد من الوظائف الأخرى. لقد أظهرت لك فقط تلك التي أستخدمها في أغلب الأحيان أثناء تقديم بعض مفاهيم الوقت المستخدم في الحوسبة. إذا كنت تريد أن تذهب أبعد من ذلك ، فأنت تعرف ماذا تفعل ... أليس كذلك؟ تعال ، أنا أشجعك بشدة لذلك أقدم لك رابط وثائق الوحدةtime  .

وحدة التاريخ والوقت (datetime)



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

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

تمثيل تاريخًا


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

من الممكن بالطبع استخراج هذه المعلومات من الطابع الزمني الخاص بنا.  datetime تقدم الوحدة فئة date، يمثل تاريخًا ، مجرد تاريخ.

الكائن له ثلاث سمات:

  • year : السنة؛
  • month : شهر ؛
  • day : يوم الشهر.
كيف نبدأ في بناء موضوعنا date؟

هناك عدة طرق للقيام بذلك. يأخذ مُنشئ هذه الفئة ثلاث حجج هي ، بالترتيب ، السنة والشهر واليوم من الشهر.


>>> import datetime
>>> date = datetime.date(2010, 12, 25)
>>> print(date)
2010-12-25
>>>
 
هناك طريقتان للفئة قد تكون مهتمًا بهما:
  • date.today() : إرجاع تاريخ اليوم؛
  • date.fromtimestamp(timestamp) : إرجاع التاريخ المقابل للطابع الزمني الذي تم تمريره كوسيطة.
دعونا نرى في الممارسة:

>>> import time
>>> import datetime
>>> aujourdhui = datetime.date.today()
>>> aujourdhui
datetime.date(2011, 2, 14)
>>> datetime.date.fromtimestamp(time.time()) # Équivalent à date.today
datetime.date(2011, 2, 14)
>>>
 
وبالطبع ، يمكنك بسهولة معالجة هذه التواريخ ومقارنتها باستخدام عوامل التشغيل المعتادة ، وسأدعك تجرب!

تمثيل ساعة


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

نبني ساعة ليس بثلاث معاملات بل خمس معلمات ، كلها اختيارية:

  • hour(0 افتراضيًا): الساعات ، القيمة بين 0 و 23 ؛
  • minute(0 افتراضيًا): الدقائق ، القيمة بين 0 و 59 ؛
  • second(0 افتراضيًا): الثواني ، القيمة بين 0 و 59 ؛
  • microsecond(0 افتراضيًا): دقة الوقت بالثواني الدقيقة ، بين 0 و 1،000،000 ؛
  • tzinfo( Noneافتراضي): معلومات المنطقة الزمنية (لن أفصل هذه المعلومات هنا).
هذه الفئة أقل استخدامًا من datetime.date ولكنها قد تكون مفيدة في بعض الحالات. سأسمح لك بإجراء بعض الاختبارات ، ولا تنس الرجوع إلى وثائق الوحدة datetime للحصول على مزيد من المعلومات.

تمثيل التواريخ والأوقات


ونحن هنا! لن تتفاجأ كثيرًا بما نحن على وشك تغطيته. لقد رأينا طريقة لتمثيل تاريخ ، وطريقة لتمثيل الوقت ، ولكن يمكننا بشكل طبيعي تمثيل تاريخ ووقت في نفس الكائن ، فمن المحتمل أن تكون هذه هي الفئة الذي ستستخدمها في أغلب الأحيان. الذي يثير اهتمامنا يسمى datetime ، مثل وحدته.

يأخذ أولاً معلمات datetime.date (السنة ، الشهر ، اليوم) ثم معلمات datetime.time (الساعات ، الدقائق ، الثواني ، الميكروثانية والمنطقة الزمنية) .

الآن دعنا نلقي نظرة على طريقتين ستستخدمهما في أغلب الأحيان:

  • datetime.now() : إرجاع الكائن datetimeبالتاريخ والوقت الحاليين ؛
  • datetime.fromtimestamp(timestamp) : إرجاع تاريخ ووقت طابع زمني محدد.

>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2011, 2, 14, 5, 8, 22, 359000)
>>>
 
هناك أشياء أخرى كثيرة يجب رؤيتها في هذه الوحدة datetime . إذا كنت فضوليًا أو لديك احتياجات أكثر تحديدًا ، والتي لن أغطيها هنا ، فراجع الوثائق الرسمية للوحدة.

باختصار



  • تسمح الوحدة time ، من بين أشياء أخرى ، بالحصول على تاريخ ووقت نظامك.
  • تقوم دالة time للوحدة النمطية time بإرجاع الطابع الزمني الحالي.
  • تقوم طريقة localtime للوحدة النمطية time بإرجاع كائن يعزل المعلومات من الطابع الزمني (التاريخ والوقت).
  • الوحدة datetimeتسمح لتمثيل التواريخ والأوقات.
  • و date، timeو والطبقات datetimeالمستخدمة على التوالي لتمثيل التواريخ والأوقات، فضلا عن "التاريخ والوقت" مجموعات.