تخطَّ إلى المحتوى

التاريخ والوقت والعشوائية في Python: datetime و random

الدرس 24 من 25 · Python

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

الوحدة datetime فيها عدة أنواع، أهمها date للتاريخ فقط، و datetime للتاريخ مع الوقت:

from datetime import date, datetime, timedelta
birthday = date(2012, 5, 20)
print(birthday)
print(birthday.year, birthday.month, birthday.day)
print(birthday.weekday())
الناتج
2012-05-20
2012 5 20
6

ننشئ التاريخ بالترتيب: السنة ثم الشهر ثم اليوم. والتابع weekday يعيد رقم اليوم في الأسبوع، حيث 0 هو الإثنين و 6 هو الأحد.

وللحصول على تاريخ اليوم أو اللحظة الحالية:

print(date.today())
print(datetime.now())
مثال (سيختلف عندك)
2026-11-11
2026-11-11 18:30:27.418233

الشكل 2026-11-11 مناسب للكمبيوتر، لكن المستخدم قد يريد 11/11/2026. التابع strftime يحوّل التاريخ إلى نص بالشكل الذي تحدده، باستخدام رموز تبدأ بعلامة %:

moment = datetime(2026, 11, 11, 18, 30)
print(moment.strftime("%d/%m/%Y"))
print(moment.strftime("%H:%M"))
print(moment.strftime("%Y-%m-%d %I:%M %p"))
الناتج
11/11/2026
18:30
2026-11-11 06:30 PM
الرمز معناه مثال
%Y السنة كاملة 2026
%m الشهر برقمين 11
%d اليوم برقمين 11
%H الساعة بنظام 24 18
%I الساعة بنظام 12 06
%M الدقائق 30
%p صباحاً أو مساءً PM

والعملية العكسية بالدالة strptime: تقرأ نصاً وتحوّله إلى تاريخ حقيقي، وتعطيها الشكل الذي كُتب به النص:

d = datetime.strptime("25/12/2026", "%d/%m/%Y")
print(d.year)
print(d.strftime("%A"))
الناتج
2026
Friday

الرمز %A يعطي اسم اليوم بالإنجليزية. وهكذا عرفنا أن 25 ديسمبر 2026 يوافق يوم جمعة.

الحساب بالتواريخ: timedelta

Section titled “الحساب بالتواريخ: timedelta”

أجمل ما في الوحدة أنك تطرح تاريخاً من تاريخ، وتترك لها حساب أطوال الشهور والسنوات الكبيسة:

start = date(2026, 9, 20)
exam = date(2026, 12, 25)
print((exam - start).days)
print(start + timedelta(days=45))
print(exam - timedelta(weeks=2))
الناتج
96
2026-11-04
2026-12-11

ناتج طرح تاريخين قيمة من نوع timedelta، وهي تمثل مدة زمنية، ونقرأ منها عدد الأيام بالخاصية days. ونستطيع إنشاء مدة بأنفسنا مثل timedelta(days=45) ثم نجمعها على تاريخ أو نطرحها منه.

تخيّل date مثل نقطة على خريطة، و timedelta مثل مسافة: نقطة ناقص نقطة تعطي مسافة، ونقطة زائد مسافة تعطي نقطة جديدة.

استخدمت random.randint في مشروع لعبة التخمين. والوحدة فيها دوال أخرى مفيدة:

import random
random.seed(7)
print(random.randint(1, 6))
print(random.choice(["حجر", "ورقة", "مقص"]))
print(random.random())
الناتج
3
حجر
0.3948234964231735
  • randint(1, 6) رقم صحيح عشوائي يشمل الطرفين، مثل حجر النرد.
  • choice تختار عنصراً عشوائياً من قائمة.
  • random() تعيد رقماً عشرياً بين 0 و 1.

وهذه دالتان للتعامل مع القوائم:

random.seed(7)
cards = ["أ", "ب", "ج", "د", "هـ"]
random.shuffle(cards)
print(cards)
print(random.sample(range(1, 50), 6))
الناتج
['هـ', 'أ', 'د', 'ب', 'ج']
[5, 35, 7, 24, 38, 4]

shuffle تخلط القائمة نفسها مثل خلط أوراق اللعب، ولا تعيد شيئاً. و sample تختار عدداً من العناصر بدون تكرار، وهي مناسبة لسحب أرقام فائزة.

برنامج صغير يختار طالباً عشوائياً ليقدّم عرضاً، ويحدد له موعداً بعد أسبوع من تاريخ معيّن:

random.seed(3)
students = ["سارة", "عمر", "ليلى", "خالد"]
chosen = random.choice(students)
due = date(2026, 11, 11) + timedelta(weeks=1)
print(f"{chosen} يقدّم العرض يوم {due.strftime('%d/%m/%Y')}")
الناتج
عمر يقدّم العرض يوم 18/11/2026

اكتب برنامجاً يحسب عمرك بالأيام: أنشئ تاريخ ميلادك بـ date، واطرحه من date.today()، واطبع عدد الأيام. ثم اطبع تاريخ اليوم الذي تكمل فيه 10000 يوم من عمرك. مثال لمن وُلد في 20 مايو 2012 وشغّل البرنامج في 11 نوفمبر 2026:

الناتج
عمرك 5288 يوماً
تكمل 10000 يوم في 06/10/2039
  • الخلط بين الوحدة والنوع: الوحدة اسمها datetime وفيها نوع اسمه datetime أيضاً. إذا كتبت import datetime فالصحيح datetime.date(...)، وإذا كتبت from datetime import date فالصحيح date(...) مباشرة.
  • تاريخ غير موجود: date(2026, 2, 30) يسبب ValueError، لأن فبراير ليس فيه يوم 30.
  • الخلط بين %m و %M: الحرف الصغير للشهر، والكبير للدقائق.
  • انتظار قيمة من shuffle: كتابة cards = random.shuffle(cards) تجعل cards تساوي None، لأن الدالة تخلط القائمة في مكانها.

سؤال

ما نوع القيمة الناتجة من طرح تاريخ من تاريخ؟

سؤال

أي دالة تختار 3 عناصر مختلفة من قائمة؟

  • date(سنة, شهر, يوم) ينشئ تاريخاً، و date.today() يعطي تاريخ اليوم.
  • strftime تحوّل التاريخ إلى نص بالشكل الذي تريده، و strptime تقرأ نصاً إلى تاريخ.
  • طرح تاريخين يعطي timedelta، وتستطيع جمع مدة على تاريخ.
  • random فيها randint و choice و shuffle و sample و random.
  • random.seed تثبّت النتائج للاختبار، و secrets هي المناسبة للأمان.