50 lines
1.7 KiB
Python
50 lines
1.7 KiB
Python
"""تبدیل تاریخ میلادی به شمسی برای نمایش تاریخ انتشار مقاله — بدون وابستگی
|
|
به پکیج خارجی (همان الگوریتم استاندارد تبدیل جلالی)."""
|
|
|
|
_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)
|