Package jdatetime :: Module jalali
[hide private]
[frames] | no frames]

Source Code for Module jdatetime.jalali

  1  #dervied from http://farsitools.sf.net 
  2  #Copyright (C) 2003-2011  Parspooyesh Fanavar (http://parspooyesh.com/) 
  3  #see LICENSE.txt 
  4  g_days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 
  5  j_days_in_month = [31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29] 
  6   
  7   
8 -class GregorianToJalali:
9
10 - def __init__(self,gyear,gmonth,gday):
11 """ 12 Convert gregorian date to jalali date 13 gmonth: number of month in range 1-12 14 """ 15 self.gyear=gyear 16 self.gmonth=gmonth 17 self.gday=gday 18 self.__gregorianToJalali()
19
20 - def getJalaliList(self):
21 return (self.jyear,self.jmonth,self.jday)
22
23 - def __gregorianToJalali(self):
24 """ 25 g_y: gregorian year 26 g_m: gregorian month 27 g_d: gregorian day 28 """ 29 global g_days_in_month,j_days_in_month 30 31 gy = self.gyear-1600 32 gm = self.gmonth-1 33 gd = self.gday-1 34 35 g_day_no = 365*gy+(gy+3)/4-(gy+99)/100+(gy+399)/400 36 37 for i in range(gm): 38 g_day_no += g_days_in_month[i] 39 if gm>1 and ((gy%4==0 and gy%100!=0) or (gy%400==0)): 40 # leap and after Feb 41 g_day_no+=1 42 g_day_no += gd 43 44 j_day_no = g_day_no-79 45 46 j_np = j_day_no / 12053 47 j_day_no %= 12053 48 jy = 979+33*j_np+4*int(j_day_no/1461) 49 50 j_day_no %= 1461 51 52 if j_day_no >= 366: 53 jy += (j_day_no-1)/ 365 54 j_day_no = (j_day_no-1)%365 55 56 for i in range(11): 57 if not j_day_no >= j_days_in_month[i]: 58 i-=1 59 break 60 j_day_no -= j_days_in_month[i] 61 62 jm = i+2 63 jd = j_day_no+1 64 65 66 self.jyear=jy 67 self.jmonth=jm 68 self.jday=jd
69 70 71
72 -class JalaliToGregorian:
73 - def __init__(self,jyear,jmonth,jday):
74 """ 75 Convert db time stamp (in gregorian date) to jalali date 76 """ 77 self.jyear=jyear 78 self.jmonth=jmonth 79 self.jday=jday 80 self.__jalaliToGregorian()
81
82 - def getGregorianList(self):
83 return (self.gyear,self.gmonth,self.gday)
84 85
86 - def __jalaliToGregorian(self):
87 global g_days_in_month,j_days_in_month 88 jy = self.jyear-979 89 jm = self.jmonth-1 90 jd = self.jday-1 91 92 93 j_day_no = 365*jy +int(jy/33)*8 + (jy%33+3)/4 94 for i in range(jm): 95 j_day_no += j_days_in_month[i] 96 97 j_day_no += jd 98 99 g_day_no = j_day_no+79 100 101 gy = 1600 + 400*int(g_day_no/ 146097) # 146097 = 365*400 + 400/4 - 400/100 + 400/400 102 g_day_no = g_day_no % 146097 103 104 leap = 1 105 if g_day_no >= 36525: # 36525 = 365*100 + 100/4 106 g_day_no-=1 107 gy += 100*int(g_day_no/ 36524) # 36524 = 365*100 + 100/4 - 100/100 108 g_day_no = g_day_no % 36524 109 110 if g_day_no >= 365: 111 g_day_no+=1 112 else: 113 leap = 0 114 115 116 gy += 4*int(g_day_no/1461) # 1461 = 365*4 + 4/4 117 g_day_no %= 1461 118 119 if g_day_no >= 366: 120 leap = 0 121 g_day_no-=1 122 gy += g_day_no/365 123 g_day_no = g_day_no % 365 124 125 i=0 126 while g_day_no >= g_days_in_month[i] + (i == 1 and leap): 127 g_day_no -= g_days_in_month[i] + (i == 1 and leap) 128 i+=1 129 self.gmonth = i+1 130 self.gday = g_day_no+1 131 self.gyear = gy
132