FA-TOOLS — Header Component
کدهای پایتون برای کار با تاریخ شمسی

کدهای پایتون برای کار با تاریخ شمسی

سلام رفیق برنامه‌نویس! اگه تا حالا درگیر تاریخ شمسی و میلادی و ساعت و زمان تو پروژه‌های پایتونی‌ت شدی و سردرگم موندی، نگران نباش. این مقاله مثل یه نقشه راه دقیق، بهت نشون میده چطور با قدرت پایتون، تاریخ شمسی رو رام خودت کنی! از نصب کتابخونه‌ها گرفته تا انجام پیچیده‌ترین عملیات‌های زمانی. اینجا قراره تمام فوت و فن‌ها رو یاد بگیری و از هر چالش تقویمی به راحتی عبور کنی. پس اگه دنبال یه راه حل جامع و کاربردی برای مدیریت تاریخ شمسی هستی، تا آخرش با من باش. راستی، برای کلی ابزار و اسنیپت پایتونی و وب، حتماً یه سر به فروشگاه ابزارهای FA-Tools بزن، مطمئنم چیزای باحالی پیدا می‌کنی! اگه هم سوالی داشتی یا نیاز به راهنمایی بیشتر بود، مستقیم تماس بگیر: 09202232789

💡 نقشه راه جامع: کار با تاریخ شمسی در پایتون در یک نگاه 💡

کدهای پایتون برای کار با تاریخ شمسی — تصویر 1

۱. شروع: نصب کتابخانه‌ها

pip install jdatetime
pip install persian-calendar

➡️

۲. ساخت و تبدیل تاریخ

میلادی به شمسی
شمسی به میلادی
ساخت تاریخ خاص

➡️

۳. عملیات رایج

افزودن/کاهش زمان
مقایسه و اختلاف
فرمت‌دهی دلخواه

➡️

۴. بهترین روش‌ها و عیب‌یابی

مدیریت تایم‌زون
حل مشکلات انکودینگ
نکات پرفرمنس

چرا کار با تاریخ شمسی تو پایتون انقدر مهمه؟

کدهای پایتون برای کار با تاریخ شمسی — تصویر 2
ببینید رفقا، تو ایران، همه چیز بر اساس تقویم شمسی کار می‌کنه؛ از تاریخ فاکتورها و تراکنش‌های بانکی گرفته تا تاریخ تولد و مهلت‌های اداری. اگه تو پروژه‌های پایتونی‌ت (چه وب‌سایت، چه اپلیکیشن یا حتی اسکریپت‌های تحلیلی) با کاربرای ایرانی سر و کار داری، نمایش تاریخ میلادی ممکنه تجربه کاربری رو حسابی خراب کنه و حتی باعث سوء تفاهم بشه. پس، بلد بودن نحوه کار با تاریخ شمسی تو پایتون نه تنها یه مزیت، بلکه یه ضرورت. این مهارته که نرم‌افزار تو رو کاربرپسندتر و مطابق با نیازهای جامعه هدف ایرانی می‌کنه. علاوه بر این، تو بحث ذخیره‌سازی داده‌ها یا تعامل با APIهای مختلف هم ممکنه نیاز داشته باشی که تاریخ‌ها رو بین فرمت‌های میلادی و شمسی تبدیل کنی. اینجاست که پایتون با کتابخونه‌های قدرتمندش، دست تو رو باز میذاره.

کتابخونه‌های محبوب برای کار با تاریخ شمسی در پایتون

کدهای پایتون برای کار با تاریخ شمسی — تصویر 3
تو دنیای پایتون، برای هر مشکلی یه راه حل خوب پیدا میشه. برای تاریخ شمسی هم همینطوره. چند تا کتابخونه هستن که کار ما رو راحت می‌کنن، اما از بینشون، `jdatetime` حکم پادشاه رو داره. در ادامه به بررسی مهم‌ترین‌ها می‌پردازیم.

jdatetime: پادشاه بی‌چون و چرا

کتابخونه `jdatetime` قدرتمندترین و کامل‌ترین ابزار برای کار با تاریخ و زمان شمسی تو پایتونه. این کتابخونه تمام قابلیت‌های ماژول استاندارد `datetime` پایتون رو برای تاریخ شمسی هم ارائه میده. یعنی اگه قبلاً با `datetime` کار کردی، کار با `jdatetime` برات مثل آب خوردنه. حتی می‌تونی باهاش تایم‌زون‌ها رو هم مدیریت کنی که خودش یه بحث جداگانه و مهمه.نصب:

برای کپی کلیک کنید

pip install jdatetime

مثال‌ها:

گرفتن تاریخ و زمان فعلی شمسی

برای کپی کلیک کنید

import jdatetime
# تاریخ و زمان فعلی شمسی
now_jalali = jdatetime.datetime.now()
print(f’تاریخ و زمان فعلی شمسی: {now_jalali}’)

# فقط تاریخ فعلی شمسی
today_jalali = jdatetime.date.today()
print(f’تاریخ امروز شمسی: {today_jalali}’)

ساخت یک تاریخ شمسی خاص

برای کپی کلیک کنید

import jdatetime
# ساخت یک تاریخ شمسی (سال، ماه، روز)
my_jalali_date = jdatetime.date(1399, 5, 20)
print(f’تاریخ دلخواه شمسی: {my_jalali_date}’)

# ساخت یک تاریخ و زمان شمسی (سال، ماه، روز، ساعت، دقیقه، ثانیه)
my_jalali_datetime = jdatetime.datetime(1402, 12, 29, 23, 59, 59)
print(f’تاریخ و زمان دلخواه شمسی: {my_jalali_datetime}’)

تبدیل تاریخ میلادی به شمسی و برعکس

برای کپی کلیک کنید

import jdatetime
import datetime
# تاریخ میلادی
miladi_date = datetime.date(2023, 10, 26)
miladi_datetime = datetime.datetime(2023, 10, 26, 14, 30, 0)

# تبدیل میلادی به شمسی
jalali_from_miladi_date = jdatetime.date.fromgregorian(date=miladi_date)
jalali_from_miladi_datetime = jdatetime.datetime.fromgregorian(datetime=miladi_datetime)
print(f’میلادی {miladi_date} به شمسی: {jalali_from_miladi_date}’)
print(f’میلادی {miladi_datetime} به شمسی: {jalali_from_miladi_datetime}’)

# تاریخ شمسی
jalali_date = jdatetime.date(1402, 8, 4)
jalali_datetime = jdatetime.datetime(1402, 8, 4, 14, 30, 0)

# تبدیل شمسی به میلادی
miladi_from_jalali_date = jalali_date.togregorian()
miladi_from_jalali_datetime = jalali_datetime.togregorian()
print(f’شمسی {jalali_date} به میلادی: {miladi_from_jalali_date}’)
print(f’شمسی {jalali_datetime} به میلادی: {miladi_from_jalali_datetime}’)

فرمت‌دهی تاریخ شمسی (strftime)

برای کپی کلیک کنید

import jdatetime
now_jalali = jdatetime.datetime.now()

# فرمت‌های مختلف
print(f’تاریخ کامل: {now_jalali.strftime(‘%Y/%m/%d – %H:%M:%S’)}’) # 1402/08/04 – 14:30:00
print(f’روز هفته: {now_jalali.strftime(‘%A’)}’) # پنج‌شنبه
print(f’نام ماه: {now_jalali.strftime(‘%B’)}’) # آبان
print(f’سال کوتاه: {now_jalali.strftime(‘%y’)}’) # 02

# ترکیب با متن فارسی (مثال ساده تر برای نمایش فارسی)
# توجه: استفاده از strftime برای نام ماه و روز هفته بهترین راه است
print(f’امروز {now_jalali.strftime(‘%A’)}، {now_jalali.day} {now_jalali.strftime(‘%B’)} ماه {now_jalali.year} سال است.’)

نکته: برای دیدن همه کدهای فرمت‌دهی (مثل %Y، %m، %d و غیره)، می‌تونید به مستندات رسمی jdatetime یا datetime مراجعه کنید.

persian-calendar: یه راه حل ساده‌تر (برای برخی کاربردها)

کتابخونه `persian-calendar` هم یه گزینه دیگه است که بیشتر برای تبدیل‌های ساده و نمایش تقویم شمسی کاربرد داره. شاید به اندازه `jdatetime` جامع نباشه، اما برای بعضی کارای سبک‌تر می‌تونه مفید باشه.نصب:

برای کپی کلیک کنید

pip install persian-calendar

مثال:

برای کپی کلیک کنید

from persiantools.jdatetime import JalaliDate
from datetime import date
# تبدیل میلادی به شمسی
miladi_date = date(2023, 10, 26)
jalali_date = JalaliDate(miladi_date)
print(f’تاریخ میلادی {miladi_date} به شمسی (persian-calendar): {jalali_date}’)

# ساخت تاریخ شمسی
my_jalali = JalaliDate(1402, 8, 4)
print(f’تاریخ شمسی دلخواه (persian-calendar): {my_jalali}’)

# تبدیل شمسی به میلادی
miladi_from_jalali = my_jalali.to_gregorian()
print(f’تاریخ شمسی {my_jalali} به میلادی: {miladi_from_jalali}’)

عملیات رایج روی تاریخ شمسی با پایتون

حالا که با کتابخونه‌ها آشنا شدیم، بریم ببینیم با این تاریخ‌های شمسی دقیقا چه کارهایی می‌تونیم بکنیم. از اضافه و کم کردن زمان گرفته تا محاسبه اختلاف، همه اینا رو پوشش میدیم.

افزودن و کم کردن روز، ماه، سال از تاریخ شمسی

مثل `datetime`، تو `jdatetime` هم می‌تونیم با استفاده از `timedelta` زمان رو کم یا زیاد کنیم. اما برای ماه‌ها و سال‌ها که طول متفاوتی دارن، باید یه خورده خلاق باشیم.

برای کپی کلیک کنید
12:n month -= 12n year += 1n while month
import jdatetime
from datetime import timedelta
current_date = jdatetime.date(1402, 8, 4)
print(f’تاریخ اصلی: {current_date}’)

# اضافه کردن روز
future_date = current_date + timedelta(days=10)
print(f’۱۰ روز بعد: {future_date}’)

# کم کردن روز
past_date = current_date – timedelta(days=5)
print(f’۵ روز قبل: {past_date}’)

# اضافه کردن ماه (نیاز به منطق دستی یا پکیج‌های کمکی)
# jdatetime مستقیما timedelta برای ماه نداره، باید سال و ماه رو تنظیم کنی.
# یک راه حل برای اضافه کردن ماه:
def add_months_jalali(d, months):
year = d.year
month = d.month + months
while month > 12:
month -= 12
year += 1
while month <= 0:
month += 12
year -= 1
try:
return jdatetime.date(year, month, d.day)
except ValueError:
# مثلا اگر روز 31 باشه و ماه 30 روزه باشه، روز رو به آخر ماه تغییر میدیم
return jdatetime.date(year, month, 1).replace(day=jdatetime.date(year, month, 1).daysinmonth)

future_month = add_months_jalali(current_date, 3)
print(f’۳ ماه بعد: {future_month}’)

# اضافه کردن سال
future_year = jdatetime.date(current_date.year + 1, current_date.month, current_date.day)
print(f’۱ سال بعد: {future_year}’)

محاسبه اختلاف بین دو تاریخ شمسی

محاسبه اختلاف بین دو تاریخ هم خیلی ساده است. فقط کافیه دو تا آبجکت `jdatetime` رو از هم کم کنی تا یه آبجکت `timedelta` بهت بده.

برای کپی کلیک کنید

import jdatetime
date1 = jdatetime.datetime(1402, 8, 4, 10, 0, 0)
date2 = jdatetime.datetime(1402, 8, 14, 15, 30, 0)

delta = date2 – date1

print(f’تاریخ اول: {date1}’)
print(f’تاریخ دوم: {date2}’)
print(f’اختلاف: {delta}’)
print(f’اختلاف بر حسب روز: {delta.days}’)
print(f’اختلاف بر حسب ثانیه: {delta.total_seconds()}’)

بهترین روش‌ها و نکات کلیدی برای کار با تاریخ شمسی

برای اینکه کدنویسیت حرفه‌ای باشه و سر مشکلات ریز و درشت اذیت نشی، یه سری نکات هست که بهتره همیشه تو ذهنت داشته باشی.

  • همیشه از `jdatetime` استفاده کن: برای اکثر پروژه‌ها، `jdatetime` بهترین و کامل‌ترین انتخابه. به ندرت پیش میاد که نیاز به چیزی جز این کتابخونه داشته باشی.
  • با تایم‌زون‌ها مهربون باش: اگه پروژه‌ت کاربرای بین‌المللی داره یا با سرورهایی تو مناطق زمانی مختلف کار می‌کنی، مدیریت تایم‌زون‌ها رو جدی بگیر. `jdatetime` از تایم‌زون‌ها پشتیبانی می‌کنه، اما باید بدونی چطور ازشون استفاده کنی.
  • ذخیره‌سازی تاریخ: معمولاً بهتره تاریخ‌ها رو تو دیتابیس به فرمت UTC (میلادی) ذخیره کنی و فقط هنگام نمایش به کاربر، اونا رو به شمسی تبدیل کنی. این کار از کلی دردسر در آینده جلوگیری می‌کنه.
  • اعتبار سنجی ورودی: همیشه تاریخ‌های ورودی از کاربر رو اعتبار سنجی کن تا مطمئن بشی فرمت و مقادیرشون درسته.

برای اینکه بهتر متوجه تفاوت‌های `jdatetime` و `datetime` بشیم، این جدول آموزشی رو ببین:

ویژگی jdatetime (تاریخ شمسی)
نوع تقویم خورشیدی (شمسی)
توابع مشابه datetime jdatetime.date, jdatetime.datetime, timedelta
تبدیل به میلادی متد .togregorian()
تبدیل از میلادی متد .fromgregorian()
فرمت‌دهی (strftime) بله، با پشتیبانی از نام‌های شمسی

اینفوگرافیک: جریان تبدیل تاریخ در پایتون (شمسی ↔️ میلادی)

🔄 گردش کار تبدیل تاریخ 🔄

╔═════════════════════════════════════════════════════════════╗
║                      شروع: داده ورودی                        ║
╠═════════════════════════════════════════════════════════════╣
║    [تاریخ میلادی (datetime)] OR [تاریخ شمسی (jdatetime)] ║ ╚═════════════════════════════════════════════════════════════╝ ⬇️ ⬇️ | | | استفاده از jdatetime | | | ╔═════════════════════════════════════════════════════════════╗ ║ فرآیند تبدیل و کار با تاریخ ║ ╠═════════════════════════════════════════════════════════════╣ ║ 1. تبدیل میلادی به شمسی: ║ ║ `jdatetime.date.fromgregorian(date=miladi_obj)` ║ ║ `jdatetime.datetime.fromgregorian(datetime=miladi_obj)` ║ ║ ║ ║ 2. تبدیل شمسی به میلادی: ║ ║ `jalali_obj.togregorian()` ║ ║ ║ ║ 3. عملیات رایج (افزودن/کاهش، فرمت‌دهی): ║ ║ `jalali_obj + timedelta(...)` ║ ║ `jalali_obj.strftime('%Y/%m/%d')` ║ ╚═════════════════════════════════════════════════════════════╝ ⬇️ | ╔═════════════════════════════════════════════════════════════╗ ║ پایان: خروجی دلخواه ║ ╠═════════════════════════════════════════════════════════════╣ ║ [نمایش تاریخ به کاربر (شمسی)] OR [ذخیره در دیتابیس (میلادی)] ║ ╚═════════════════════════════════════════════════════════════╝

این دیاگرام یه دید کلی از مسیری که باید طی کنی بهت میده. مهم اینه که بدونی کی و کجا از کدوم تابع استفاده کنی.

چالش‌ها و راه حل‌های رایج (Troubleshooting)

همیشه که همه چیز گل و بلبل نیست! گاهی ممکنه با مشکلاتی روبرو بشی. اینجا چند تا از چالش‌های رایج و راه حل‌هاشون رو با هم بررسی می‌کنیم:

مشکل ۱: کاراکترهای فارسی در خروجی بهم ریخته نشون داده میشن (Encoding)

اگه نام روزهای هفته یا ماه‌های شمسی تو خروجی `strftime` به هم ریخته یا علامت سوال نشون داده میشه، احتمالاً مشکل از Encoding ترمینال یا محیط توسعه‌ت هست.

راه حل:

  1. تغییر Encoding فایل پایتون: مطمئن شو که فایل پایتون رو با UTF-8 ذخیره کردی. معمولاً با افزودن این خط در ابتدای فایل مشکل حل میشه:
    برای کپی کلیک کنید

    # -*- coding: utf-8 -*-
  2. تنظیم Encoding ترمینال: در CMD ویندوز می‌تونی با `chcp 65001` encoding رو به UTF-8 تغییر بدی. تو لینوکس و macOS معمولاً این مشکل کمتر پیش میاد.
  3. استفاده از `.decode()` و `.encode()`: در موارد خاص، ممکنه نیاز باشه رشته‌های فارسی رو به صورت دستی encode یا decode کنی، اما با رعایت مورد اول، کمتر به این کار نیاز پیدا می‌کنی.

مشکل ۲: خطا در نصب jdatetime (Dependency issues)

گاهی اوقات `pip install jdatetime` با خطاهای عجیبی مواجه میشه. این معمولاً به خاطر نسخه‌های قدیمی `pip` یا مشکلات پایتون خودت هست.

راه حل:

  1. آپدیت `pip`: همیشه `pip` رو به روز نگه دار:
    برای کپی کلیک کنید

    python -m pip install --upgrade pip
  2. محیط مجازی (Virtual Environment): همیشه از محیط مجازی استفاده کن. این کار از تداخل پکیج‌ها جلوگیری می‌کنه:
    برای کپی کلیک کنید

    python -m venv myenv
    ./myenv/Scripts/activate # Windows
    source myenv/bin/activate # Linux/macOS
    pip install jdatetime

مشکل ۳: مدیریت تایم‌زون‌ها (Timezone Awareness)

تو بحث زمان، تایم‌زون یه چالش اساسی. اگه تاریخ‌های تو از جاهای مختلفی میان یا قراره در مناطق زمانی متفاوت استفاده بشن، باید حواست به تایم‌زون باشه. `jdatetime` خودش به صورت پیش‌فرض با تایم‌زون لوکال سیستم کار می‌کنه، اما اگه بخوای explicit باشی، باید از ماژول `pytz` یا `zoneinfo` (از پایتون 3.9 به بعد) استفاده کنی.

راه حل:

  1. نصب `pytz`:
    برای کپی کلیک کنید

    pip install pytz
  2. استفاده از تایم‌زون:
    برای کپی کلیک کنید

    import jdatetime
    import pytz
    tehran_tz = pytz.timezone(‘Asia/Tehran’)

    # تاریخ و زمان فعلی با تایم‌زون تهران
    now_tehran = jdatetime.datetime.now(tehran_tz)
    print(f’زمان فعلی در تهران: {now_tehran}’)

    # تبدیل یک تاریخ ناآگاه به آگاه از تایم‌زون
    naive_dt = jdatetime.datetime(1402, 8, 4, 10, 0, 0)
    aware_dt = tehran_tz.localize(naive_dt)
    print(f’تاریخ با تایم‌زون: {aware_dt}’)

نکته آخر: همیشه در پروژه‌های بزرگ یا تیم‌های برنامه‌نویسی، یک استاندارد برای کار با تاریخ (میلادی در دیتابیس، شمسی در نمایش به کاربر) و پیکرنبدی تایم‌زون‌ها تعریف کنید. این کار جلوی کلی از مشکلات آتی رو می‌گیره. اگه به اسنیپت‌های پایتون یا سایر کدهای آماده نیاز داری، می‌تونی اونجا هم موارد بیشتری پیدا کنی.

نتیجه‌گیری و گام‌های بعدی

خب رفیق، تا اینجا فهمیدی که کار با تاریخ شمسی تو پایتون اونقدرها هم که فکر می‌کردی سخت نیست. با استفاده از کتابخونه قدرتمند `jdatetime` می‌تونی تقریباً هر عملیاتی که با تاریخ میلادی انجام میدادی رو با تاریخ شمسی هم پیاده‌سازی کنی. از تبدیل فرمت‌ها گرفته تا جمع و تفریق زمان، همه چیز در دست توئه.حالا که با اصول کلی آشنا شدی، وقتشه که آستین بالا بزنی و این کدها رو تو پروژه‌های خودت امتحان کنی. هر چی بیشتر کد بزنی و دست و پنجه نرم کنی، سریع‌تر مسلط میشی. یادت نره، برنامه‌نویسی یه مهارته که با تمرین و تکرار تقویت میشه.

اگه تو پروژه‌ات نیاز به اسنیپت‌های CSS، کدهای JavaScript، بخش‌های HTML آماده یا حتی ترفندهای وردپرسی داری، حتماً یه سر به بلاگ ما بزن. کلی محتوای دست اول و کاربردی برات آماده کردیم.
موفق باشی!

سوالات متداول (FAQ)

آیا jdatetime از روزهای کبیسه شمسی پشتیبانی می‌کند؟

بله، کتابخانه jdatetime به طور کامل از تقویم شمسی از جمله سال‌های کبیسه پشتیبانی می‌کند و محاسبات را به درستی انجام می‌دهد. شما نیازی به مدیریت دستی این جزییات ندارید.

بهترین روش برای ذخیره تاریخ‌ها در دیتابیس چیست؟

توصیه اکید این است که تاریخ‌ها را در دیتابیس به فرمت میلادی (Gregorian) و ترجیحاً با تایم‌زون UTC ذخیره کنید. این کار سازگاری با سیستم‌های جهانی و ابزارهای مختلف را تضمین می‌کند. تبدیل به شمسی فقط باید هنگام نمایش به کاربر نهایی انجام شود.

آیا می‌توانم با jdatetime ساعت و دقیقه را هم مدیریت کنم؟

بله، jdatetime.datetime علاوه بر تاریخ، امکان مدیریت ساعت، دقیقه، ثانیه و حتی میکروثانیه را نیز فراهم می‌کند. این کلاس تمام قابلیت‌های datetime.datetime پایتون را برای تقویم شمسی ارائه می‌دهد.

برای پروژه‌های Django یا Flask، رویکرد خاصی برای تاریخ شمسی وجود دارد؟

در فریم‌ورک‌هایی مثل Django یا Flask، می‌توانید از jdatetime در لایه View یا Template استفاده کنید. برای مدل‌ها، بهتر است فیلدهای تاریخ را از نوع استاندارد DateTimeField یا DateField تعریف کرده و در زمان نمایش یا پردازش ورودی، تبدیل به شمسی را انجام دهید. برای Django، پکیج‌هایی مانند django-jalali هم وجود دارند که ادغام jdatetime را ساده‌تر می‌کنند.

Table of Contents

آخرین نوشته‌ها