> >CLEAR > >DIMENSION g_days_in_month[12], j_days_in_month[12] >g_days_in_month[ 1] = 31 >g_days_in_month[ 2] = 28 >g_days_in_month[ 3] = 31 >g_days_in_month[ 4] = 30 >g_days_in_month[ 5] = 31 >g_days_in_month[ 6] = 30 >g_days_in_month[ 7] = 31 >g_days_in_month[ 8] = 31 >g_days_in_month[ 9] = 30 >g_days_in_month[10] = 31 >g_days_in_month[11] = 30 >g_days_in_month[12] = 31 > >j_days_in_month[ 1] = 31 >j_days_in_month[ 2] = 31 >j_days_in_month[ 3] = 31 >j_days_in_month[ 4] = 31 >j_days_in_month[ 5] = 31 >j_days_in_month[ 6] = 31 >j_days_in_month[ 7] = 30 >j_days_in_month[ 8] = 30 >j_days_in_month[ 9] = 30 >j_days_in_month[10] = 30 >j_days_in_month[11] = 30 >j_days_in_month[12] = 29 > >j_month_name = ["Farvardin", "Ordibehesht", "Khordad", "Tir", "Mordad", "Shahrivar", "Mehr", "Aban", "Azar", "Dey", "Bahman", "Esfand"] > > > ooo = gregorian_to_jalali(2012, 1, 21) > ? ooo.Year, ooo.Month, ooo.Day > ooo = jalaliToGregorian( ooo.Year, ooo.Month, ooo.Day) >? ooo.Year, ooo.Month, ooo.Day > >function div(a, b) >return INT(a / b) > >function gregorian_to_jalali(g_y, g_m, g_d) > > gy = g_y-1600 > gm = g_m-1 > gd = g_d-1 > > g_day_no = 365*gy+div(gy+3,4)-div(gy+99,100)+div(gy+399,400); > > for i=1 TO gm > g_day_no = g_day_no + g_days_in_month[i] > NEXT > > if (gm > 1 AND ((gy%4==0 AND gy%100!=0) OR (gy%400==0))) > g_day_no = g_day_no + 1 > ENDIF > g_day_no = g_day_no + gd > > j_day_no = g_day_no-79 > > j_np = div(j_day_no, 12053) > j_day_no = j_day_no % 12053 > > jy = 979+33*j_np+4*div(j_day_no,1461) > > j_day_no = j_day_no % 1461 > > if (j_day_no >= 366) > jy = jy + div(j_day_no-1, 365) > j_day_no = (j_day_no-1)%365 > ENDIF > > for i = 1 TO 11 > IF j_day_no >= j_days_in_month[i] > j_day_no = j_day_no - j_days_in_month[i] > ELSE > EXIT > ENDIF > NEXT > jm = i > jd = j_day_no+1 > > oReturn = CREATEOBJECT([EMPTY]) > ADDPROPERTY(oReturn,[Year], jy) > ADDPROPERTY(oReturn,[Month], jm) > ADDPROPERTY(oReturn,[Day], jd) >RETURN oReturn > > >******** >FUNCTION jalaliToGregorian(j_y, j_m, j_d) > jy = j_y-979 > jm = j_m-1 > jd = j_d-1 > > j_day_no = 365*jy + div(jy, 33)*8 + div(jy%33+3, 4) > for i=1 TO jm > j_day_no = j_day_no + j_days_in_month[i] > NEXT > > j_day_no = j_day_no + jd > > g_day_no = j_day_no+79 > > gy = 1600 + 400*div(g_day_no, 146097) &&/* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */ > g_day_no = g_day_no % 146097 > > leap = .t. > if (g_day_no >= 36525) &&/* 36525 = 365*100 + 100/4 */ > g_day_no = g_day_no - 1 > gy = gy + 100*div(g_day_no, 36524) &&/* 36524 = 365*100 + 100/4 - 100/100 */ > g_day_no = g_day_no % 36524 > > if (g_day_no >= 365) > g_day_no = g_day_no + 1 > else > leap = .f. > ENDIF > ENDIF > > gy = gy + 4*div(g_day_no, 1461) && /* 1461 = 365*4 + 4/4 */ > g_day_no = g_day_no % 1461 > > if (g_day_no >= 366) > leap = .f. > > g_day_no = g_day_no - 1 > gy = gy + div(g_day_no, 365) > g_day_no = g_day_no % 365 > ENDIF > > i = 1 > DO WHILE g_day_no >= g_days_in_month[i] + IIF(i == 2 AND leap, 1, 0) > g_day_no = g_day_no - g_days_in_month[i] + IIF(i == 2 AND leap, 1, 0) > i = i + 1 > ENDDO > gm = i > gd = g_day_no+1 > oReturn = CREATEOBJECT([EMPTY]) > ADDPROPERTY(oReturn,[Year], gy) > ADDPROPERTY(oReturn,[Month], gm) > ADDPROPERTY(oReturn,[Day], gd) > >RETURN oReturn >>