Files

50 lines
1.7 KiB
Python
Raw Permalink Normal View History

2026-08-24 15:54:08 +03:30
"""تبدیل تاریخ میلادی به شمسی برای نمایش تاریخ انتشار مقاله — بدون وابستگی
به پکیج خارجی (همان الگوریتم استاندارد تبدیل جلالی)."""
_PERSIAN_MONTHS = [
"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور",
"مهر", "آبان", "آذر", "دی", "بهمن", "اسفند",
]
_PERSIAN_DIGITS = str.maketrans("0123456789", "۰۱۲۳۴۵۶۷۸۹")
def gregorian_to_jalali(date) -> tuple[int, int, int]:
gy, gm, gd = date.year, date.month, date.day
g_days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
gy2 = gy - 1600
gm2 = gm - 1
gd2 = gd - 1
g_day_no = 365 * gy2 + (gy2 + 3) // 4 - (gy2 + 99) // 100 + (gy2 + 399) // 400
for i in range(gm2):
g_day_no += g_days_in_month[i]
if gm2 > 1 and ((gy % 4 == 0 and gy % 100 != 0) or gy % 400 == 0):
g_day_no += 1
g_day_no += gd2
j_day_no = g_day_no - 79
j_np = j_day_no // 12053
j_day_no %= 12053
jy = 979 + 33 * j_np + 4 * (j_day_no // 1461)
j_day_no %= 1461
if j_day_no >= 366:
jy += (j_day_no - 1) // 365
j_day_no = (j_day_no - 1) % 365
j_days_in_month = [31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29]
jm = 0
for i, days in enumerate(j_days_in_month):
if j_day_no < days:
jm = i
break
j_day_no -= days
else:
jm = 11
jd = j_day_no + 1
return jy, jm + 1, jd
def format_jalali(date) -> str:
jy, jm, jd = gregorian_to_jalali(date)
text = f"{jd} {_PERSIAN_MONTHS[jm - 1]} {jy}"
return text.translate(_PERSIAN_DIGITS)