Skip to content

Instantly share code, notes, and snippets.

@ilius
Created December 19, 2015 12:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ilius/92aa53cb9da6484a15da to your computer and use it in GitHub Desktop.
Save ilius/92aa53cb9da6484a15da to your computer and use it in GitHub Desktop.
jalali_ordinal.py
'''
jd - ordinal = 1721425
jd = ordinal + 1721425
ordinal = jd - 1721425
>>> date=(2015, 12, 19) ; gregorian.to_jd(*date) - datetime(*date).toordinal()
1721425
'''
from bisect import bisect_left
monthLen = (31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30)
monthLenSum = [0]
for i in range(12):
monthLenSum.append(monthLenSum[-1] + monthLen[i])
def getMonthDayFromYdays(yday):
month = bisect_left(monthLenSum, yday)
day = yday - monthLenSum[month - 1]
return month, day
def jalali_to_ordinal(year, month, day):
y2 = year - 979
jdays = 365*y2 + y2//33 * 8 + (y2%33+3)//4 + monthLenSum[month-1] + (day-1)
return jdays + 584102
def ordinal_to_jalali(ordinal):
jdays = int(ordinal - 584102)
## -(1600*365 + 1600//4 - 1600//100 + 1600//400) + 365 -79 +1== -584101
#print('jdays =',jdays)
j_np = jdays // 12053
jdays %= 12053
year = 979 + 33*j_np + 4*(jdays//1461)
jdays %= 1461
if jdays >= 366:
year += (jdays-1) // 365
jdays = (jdays-1) % 365
yday = jdays+1
month, day = getMonthDayFromYdays(yday)
return year, month, day
if __name__=='__main__':
from datetime import datetime
now_dt = datetime.now()
today_ordinal = now_dt.toordinal()
for ordinal in range(today_ordinal, today_ordinal-100, -1):
j_date = ordinal_to_jalali(ordinal)
assert jalali_to_ordinal(*j_date) == ordinal
j_str = '%.4d-%.2d-%.2d'%j_date
g_str = datetime.fromordinal(ordinal).strftime('%Y-%m-%d')
print '%s %s'%(g_str, j_str)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment