⏰ فصل ۱۷: کار با تاریخ و زمان در پایتون (Date & Time)

۱۷.۱ چرا کار با تاریخ و زمان مهمه؟
ثبت زمان لاگها، زمان ثبتنام کاربران، تولید گزارش، حساب کردن سن یا بازه زمانی و… همه نیازمند تاریخ و زمان دقیق هستند. پایتون ابزارهای بسیار خوبی برای این کار داره.
۱۷.۲ آشنایی با ماژول datetime
ماژول datetime یک ابزار قدرتمند برای مدیریت و محاسبه تاریخ و ساعت است.
مثال پایه:
import datetime
now = datetime.datetime.now()
print(now) # مثل : 2025-06-09 14:25:31.123456
.now()زمان لحظهی اجرا..date()فقط تاریخ.time()فقط زمان
ساخت تاریخ و زمان custom:
birthday = datetime.date(1998, 12, 13)
meeting = datetime.datetime(2025, 6, 9, 12, 0, 0)
print(birthday) # 1998-12-13
print(meeting) # 2025-06-09 12:00:00
۱۷.۳ عملیات روی تاریخ و ساعت
جمع و تفریق (timedelta):
from datetime import datetime, timedelta
today = datetime.now()
tomorrow = today + timedelta(days=1)
yesterday = today - timedelta(days=1)
print("فردا:", tomorrow)
print("دیروز:", yesterday)
محاسبه فاصله زمانی:
d1 = datetime(2024, 1, 1)
d2 = datetime(2025, 1, 1)
delta = d2 - d1
print("اختلاف روزها:", delta.days)
۱۷.۴ فرمتدهی رشتهای به تاریخ (strftime) و برعکس (strptime)
تبدیل datetime به رشته دلخواه (فرمت سفارشی):
now = datetime.now()
print(now.strftime("%Y/%m/%d - %H:%M")) # ۲۰۲۵/۰۶/۰۹ - ۱۵:۱۲
کدهای کلیدی:
%Y: سال کامل (2025)%m: ماه%d: روز%H: ساعت (۰ تا ۲۳)%M: دقیقه%S: ثانیه
تبدیل رشته به datetime (حالت برعکس):
dt = "2025-06-09 15:12:00"
parsed = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")
print(parsed)
۱۷.۵ گرفتن timestamp (زمان یونیکس)
تایماستمپ: تعداد ثانیههای گذشته از ۱۹۷۰-۰۱-۰۱
now = datetime.now()
print(now.timestamp()) # عدد اعشاری بزرگ
برعکس (از timestamp به datetime):
ts = 1701040131
dt = datetime.fromtimestamp(ts)
print(dt)
۱۷.۶ ماژول time و خواب برنامه
گاهی لازم داری برنامه “منتظر” بمونه:
import time
print("شروع")
time.sleep(2) # دو ثانیه مکث
print("پایان")
۱۷.۷ کار با تاریخ شمسی (Jalali) و ساعت ایران در پایتون
چرا تاریخ شمسی؟
بیشتر پروژههای داخلی ایران – مانند سیستمهای مالی، پیامرسانی، مدیریت منابع انسانی و… – نیاز به نمایش و پردازش تاریخ به صورت شمسی دارند (نه میلادی). همچنین گاهی باید زمان را به «ساعت رسمی ایران» (UTC+3:30 یا UTC+4:30 در تابستان) نمایش دهیم.
راهکار استاندارد: کتابخانههای jalali
پایتون به طور پیشفرض تاریخ شمسی ندارد، اما چند کتابخانه پرکاربرد برای این کار وجود دارد.
پرکاربردترینها:
- jdatetime (ساده و استاندارد)
- khayyam و persiantools
(اما اکثراً از jdatetime استفاده میشود)
نصب jdatetime
اگر نصب نیست:
pip install jdatetime
مثالهای اساسی کار با jdatetime
تبدیل تاریخ میلادی به شمسی
import jdatetime
import datetime
now = datetime.datetime.now()
jalali = jdatetime.datetime.fromgregorian(datetime=now)
print("تاریخ شمسی:", jalali.strftime('%Y/%m/%d')) # مثلا ۱۴۰۴/۰۳/۲۰
تبدیل تاریخ شمسی به میلادی
jalali = jdatetime.date(1403, 3, 20)
gregorian = jalali.togregorian()
print("تاریخ میلادی:", gregorian)
گرفتن تاریخ امروز (شمسی)
import jdatetime
today_jalali = jdatetime.date.today()
print(today_jalali) # مثل ۱۴۰۴-۰۳-۲۰
نمایش زمان جاری و ساعت محلی ایران
برای نمایش زمان بصورت ساعت رسمی ایران، معمولاً باید timezone را مدیریت کنیم:
با pytz
pip install pytz
import datetime
import pytz
import jdatetime
tehran = pytz.timezone('Asia/Tehran')
now_tehran = datetime.datetime.now(tehran)
jalali = jdatetime.datetime.fromgregorian(datetime=now_tehran)
print("تاریخ و ساعت تهران (شمسی):", jalali.strftime("%Y/%m/%d - %H:%M"))
تبدیل تایماستمپ به تاریخ شمسی
import jdatetime
import datetime
ts = 1701040131
dt = datetime.datetime.fromtimestamp(ts)
jalali = jdatetime.datetime.fromgregorian(datetime=dt)
print(jalali.strftime("%Y/%m/%d"))
نکات حرفهای
- برای تصمیمگیری درباره تغییر ساعت تابستانی (DST)، حتماً از timezone استفاده کن.
- همیشه تاریخها را با توجه به ذخیرهسازی (میلادی) و نمایش به کاربر (شمسی) مدیریت کن.
- موقع پردازش ورودی/خروجی با تاریخها (مثلاً فرمهای وب) — دستورالعمل تبدیل و اعتبارسنجی تاریخ شمسی رو درنظر بگیر.
🟩 تمرین کاربردی
۱. برنامهای بنویس تاریخ تولد کاربر را به شمسی بگیرد و سن او را بر حسب سال/ماه/روز نمایش دهد.
۲. یک لیست از تاریخهای میلادی (مثل لیست رویدادها یا اقساط) را به شمسی تبدیل و چاپ کن.
نمونه تمرین (اول):
import jdatetime
import datetime
inp = input("تاریخ تولد (مثلاً ۱۳۷۰/۰۶/۲۸): ")
y, m, d = map(int, inp.split("/"))
birth = jdatetime.date(y, m, d).togregorian()
today = datetime.date.today()
delta = today - birth
years = delta.days // 365
months = (delta.days % 365) // 30
days = (delta.days % 365) % 30
print(f"سن شما: {years} سال و {months} ماه و {days} روز")
جمعبندی
- تاریخ و زمان پایتون برای کار با زمان ایران و تاریخ شمسی نیازمند کتابخانههای اضافی است.
- jdatetime و pytz (یا zoneinfo در پایتون ۳.۹+) ابزارهایی برای دقیقتر و بومیسازی شده دارند.
- در پروژههای واقعی، تاریخها را همیشه «میلادی» ذخیره و «شمسی» یا محلی نمایش بده.
نکات حرفهای
- زمانها رو همیشه با تایمزون ذخیره کن (برای پروژههای چندملیتی یا سرور).
- برای برنامههای حرفهایتر از کتابخانهی pendulum (یا arrow, pytz) برای مدیریت تایمزون و محاسبات جهانی استفاده میکنند.
- برای مقایسه، جمع، کم کردن و مرتبسازی تاریخها همیشه از datetime استفاده کن نه رشته.
🟩 تمرین عملی
۱. برنامهای بنویس، تاریخ تولد کاربر را بگیرد و سن او را به عدد روز حساب کند.
۲. امروز را بگیر و ۴۰ روز بعد چه روزی است را نمایش بده.
مثال حل (اولی):
from datetime import datetime
b = input("تاریخ تولد (YYYY-MM-DD): ")
birth = datetime.strptime(b, "%Y-%m-%d")
now = datetime.now()
age_days = (now - birth).days
print("سن شما به روز:", age_days)