كيفية التعامل مع التاريخ والوقت في بايثون

كيفية التعامل مع التاريخ والوقت في لغة بايثون

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

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

1. كلاسات بايثون للتاريخ والوقت

يوجد في بايثون خمس كلاسات للعمل مع التاريخ والوقت:

  • date: يحتوي على معلومات التاريخ فقط (السنة ، الشهر ، اليوم).
  • time: الوقت – يشير إلى الوقت الفعلي (ساعة ، دقيقة ، ثانية).
  • datetime: تجمع بين معلومات التاريخ والوقت.
  • timedelta: يمثل الفرق بين التواريخ أو الوقت.
  • tzinfo: يعالج معلومات المنطقة الزمنية.

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

# Starting with the required imports
from datetime import datetime, date, time, timedelta

الآن دعنا نرى ما يمكننا فعله بهذه الكلاسات.

معرفة الوقت والتاريخ الحالي

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

للحصول على التاريخ الحالي ، يمكنك استخدام طريقة today() لفئة التاريخ أي أنك ستكتب date.today().

# Getting current date
today = date.today()
print ("Today's date is ", today)
print ("Current year is ", today.year)
print ("Current month is ", today.month)
print ("Current day is ", today.day)
print ("Current weekday is ", today.weekday())
Today's date is  2021-12-16
Current year is  2021
Current month is  12
Current day is  16
Current weekday is  3

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

لاحظ أنه يتم تقديم أيام الأسبوع كأرقام وتبدأ مع الرقم 0 المقابل ليوم الاثنين ، ورقم 1 يشير ليوم الثلاثاء ، ورقم 2 يشير ليوم الأربعاء ، وعلي هذا التسلسل لنهاية أيام الأسبوع. لذلك إذا كنت تريد طباعة اسم يوم من أيام الأسبوع ، فلديك خياران:

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

لا يعتبر أي من الطريقتين أكثر كفاءة من الآخر ، لذا استخدم الطريقة التي تفضلها أنت.

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

# Getting current time
time = datetime.now()
print("It's", time, "now.")
print ("\n", "Hour:", time.hour,
       "\n","Minute:", time.minute,
       "\n","Second:", time.second,
       "\n","Microsecond:", time.microsecond)
It's 2021-12-16 13:27:16.403376 now.

 Hour: 13 
 Minute: 27 
 Second: 16 
 Microsecond: 403376

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

إنشاء كائنات Datetime

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

# Creating date object
mahmoud_birthday = date(1879, 3, 14)
print ('mahmoud\'s birthday is on {}.'.format(mahmoud_birthday))
mahmoud's birthday is on 1879-03-14.

# Creating datetime object
mahmoud_birthtime = datetime(1879, 3, 14, 8, 34, 55, 2345)
print ('mahmoud was born on {}.'.format(mahmoud_birthtime))
mahmoud was born on 1879-03-14 08:34:55.002345.

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

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

تنسيق الوقت والتاريخ

حتى الآن تمت طباعة التواريخ والأوقات التي عملنا معها بالتنسيق الافتراضي “YYYY-MM-DD HH: MM: SS” ومع ذلك تمنحك بايثون قدرًا أكبر من المرونة في كيفية تنسيق التواريخ والأوقات. علاوة على ذلك ستحتاج إلى إتقان طريقة تنسيق واحدة فقط للحصول على التواريخ والأوقات بأي تنسيق تريده باستخدام الدالة strftime().

لتغيير تنسيق التاريخ والوقت ، ستحتاج ببساطة إلى تمرير التنسيق المناسب إلى الدالة strftime(). يتم التعبير عن التنسيق باستخدام توجيهات خاصة مثل:

  • ٪Y العام بالقرن ، على سبيل المثال (2021).
  • ٪y السنة بدون قرن ، على سبيل المثال (21).
  • ٪B الشهر كإسم كامل ، على سبيل المثال (March).
  • ٪b شهر كإسم مختصر ، على سبيل المثال (Mar).
  • ٪m الشهر كعدد صحيح ، على سبيل المثال (03).
  • ٪d اليوم كعدد صحيح ، على سبيل المثال (25).
  • ٪A أيام الأسبوع كإسم كامل ، على سبيل المثال (Monday).
  • ٪a أيام الأسبوع كإسم مختصر ، على سبيل المثال (Mon).

دعونا نرى كيف يمكننا اللعب بهذه التنسيقات المختلفة:

# Formatting a date object
mahmoud_birthday = datetime(1879, 3, 14)
print ('mahmoud was born on {}.'.format(mahmoud_birthday))
print ('mahmoud was born on {}.'.format(mahmoud_birthday.strftime('%b %d, %Y')))
print ('mahmoud was born on {}.'.format(mahmoud_birthday.strftime('%a, %B %d, %Y')))
print ('mahmoud was born on {}.'.format(mahmoud_birthday.strftime('%A, %B %d, %Y')))
print ('mahmoud was born on {}.'.format(mahmoud_birthday.strftime('%d.%m.%Y')))
print ('mahmoud was born on {}.'.format(mahmoud_birthday.strftime('%d/%m/%y')))
mahmoud was born on 1879-03-14 00:00:00.
mahmoud was born on Mar 14, 1879.
mahmoud was born on Fri, March 14, 1879.
mahmoud was born on Friday, March 14, 1879.
mahmoud was born on 14.03.1879.
mahmoud was born on 14/03/79.

يمكنك بالفعل تنسيق الوقت بالطريقة نفسها ، لكن مع توجيهات مختلفة:

  • يمثل ٪H الساعات بتنسيق 24 ساعة.
  • يمثل ٪I الساعات بتنسيق 12 ساعة.
  • يشير ٪M إلى الدقائق.
  • يشير ٪S إلى الثواني.
  • يشير ٪p إلى ما إذا كان الوقت صباحًا أو مساءً.
# Formatting a time object
meeting_time = datetime.time(datetime (2019, 3, 25, 20, 30))
print ('Meeting starts at {}.'.format(meeting_time))
print ('Meeting starts at {}.'.format(meeting_time.strftime('%H:%M')))
print ('Meeting starts at {}.'.format(meeting_time.strftime('%I:%M %p')))
Meeting starts at 20:30:00.
Meeting starts at 20:30.
Meeting starts at 08:30 PM.
تحويل السلاسل النصية إلى كائنات التاريخ والوقت

إذا تم تمثيل التواريخ أو الأوقات في البيانات الخاصة بك كسلاسل نصية فيمكنك تحويلها بسهولة إلى كائنات التاريخ والوقت باستخدام الدالة strptime().

على سبيل المثال ، لنفترض أنك بحاجة إلى استخراج التواريخ من نص معين حيث يتم تمثيل هذه التواريخ على أنها “25 مارس 2021”. ستحتاج فقط إلى تمرير هذه السلسلة النصية والتنسيق المطلوب إلى الدالة strptime (). انظر إلي المثال التالي:

# Converting strings to dates
date = datetime.strptime('March 25, 2019', '%B %d, %Y')
print(date)
2019-03-25 00:00:00
مقارنة كائنات التاريخ والوقت

لنتخيل أننا نعرف وقت الولادة الدقيق ليس فقط لمحمود ولكن أيضًا لأحمد ومحمد. إذا كيف نقارن كائنات التاريخ والوقت تلك في بايثون؟

حسنًا ، يمكنك مقارنة كائنات التاريخ والوقت بنفس الطريقة التي تقارن بها الأرقام: مع العامل أكبر من > وأقل من <.

# Comparing times
mahmoud = datetime(1997, 3, 14, 8, 34, 55, 2345)
ahmed = datetime(1992, 1, 4, 15, 55, 4, 15432)
mohamed = datetime(2005, 1, 8, 22, 13, 43, 78432)

print(mahmoud > ahmed)
print(mohamed < ahmed)
True
False
> 
النشرة البريدية لمدونة مطورين
قياس الفترات الزمنية

نحن نعلم أن أينشتاين ولد بعد نيوتن ، لكن ما هي الفترة الزمنية بينهما؟ هيا نكتشف ذلك:

# Calculating the difference between two dates
einstein_birthday = datetime(1879, 3, 14, 8, 34, 55, 2345)
newton_birthday = datetime(1643, 1, 4, 15, 55, 4, 15432)

diff = einstein_birthday - newton_birthday
print (diff)
print ('Einstein was born {} years later than Newton.'.format(round(diff.days/365)))
86265 days, 16:39:50.986913
Einstein was born 236 years later than Newton.

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

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

إنشاء كائنات timedelta في بايثون
إنشاء كائنات timedelta في بايثون

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

einstein_birthday = datetime(1879, 3, 14, 8, 34, 55, 2345)

# Calculating the date 100 days before Einstein's birth
einstein_100days_before = einstein_birthday + timedelta(days=-100)
print ('Einstein was born 100 days after {}.'.format(einstein_100days_before))
Einstein was born 100 days after 1878-12-04 08:34:55.002345.
einstein_birthday = datetime(1879, 3, 14, 8, 34, 55, 2345)

# Calculating the date 4 weeks after Einstein's birth
einstein_4weeks_after = einstein_birthday + timedelta(weeks=4)
print ('Einstein was 4 weeks old on {}.'.format(einstein_4weeks_after))
Einstein was 4 weeks old on 1879-04-11 08:34:55.002345.

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

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

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

close
النرة البريدية لمدونة مطورين

انضم إلي نشرتنا البريدية

الصورة الافتراضية
أحمد حسين
مطور ويب متكامل وأمتلك خبرة في تصميم وتطوير تطبيقات الويب باستخدام لغة بايثون وإطار Django

اترك ردّاً