⏰ فصل ۱۷: کار با تاریخ و زمان در پایتون (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)

محمد وب‌سایت

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *