24 #include <tqdatetime.h>
26 #include <tqstringlist.h>
34 #include "kcalendarsystemjalali.h"
36 static const int gMonthDay[2][13]={
37 {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
38 {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
41 static const int jMonthDay[2][13] = {
42 {0, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29},
43 {0, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30},
53 static int Ceil(
float number)
62 static long jalali_jdn(
int year,
int month,
int day)
64 const long PERSIAN_EPOCH = 1948321;
70 epyear = 474 + (epbase % 2820);
72 mdays = (month - 1) * 31;
74 mdays = (month - 1) * 30 + 6;
76 jdn += (((epyear * 682) - 110) / 2816) ;
77 jdn += (epyear - 1) * 365;
78 jdn += (epbase / 2820) * 1029983 ;
79 jdn += (PERSIAN_EPOCH - 1);
84 static SDATE jdn_jalali(
long jdn)
88 int iYear, iMonth, iDay;
98 depoch = jdn - jalali_jdn(year,month, day);
99 cycle = (int) (depoch / 1029983);
100 cyear = depoch % 1029983;
101 if( cyear == 1029982)
106 ycycle = (((2134 * aux1) + (2816 * aux2) + 2815) / 1028522) + aux1 + 1;
108 iYear = ycycle + (2820 * cycle) + 474;
112 yday = (jdn - jalali_jdn(year, month, day)) + 1;
114 iMonth = Ceil((yday-1) / 31);
116 iMonth = Ceil((yday - 7) / 30);
119 iDay = (jdn - jalali_jdn(year, month, day)) + 1;
128 static long civil_jdn(
int year,
int month,
int day)
130 long jdn = ((1461 * (year + 4800 + ((month - 14) / 12))) / 4)
131 + ((367 * (month - 2 - 12 * (((month - 14) / 12)))) / 12)
132 - ((3 * (((year + 4900 + ((month - 14) / 12)) / 100))) / 4)
137 static SDATE jdn_civil(
long jdn)
141 int iday, imonth, iyear;
143 n = ((4 * l) / 146097);
144 l = l - ((146097 * n + 3) / 4);
145 i = ((4000 * (l + 1)) / 1461001);
146 l = l - ((1461 * i) / 4) + 31;
147 j = ((80 * l) / 2447);
148 iday = l - ((2447 * j) / 80);
150 imonth = j + 2 - 12 * l;
151 iyear = 100 * (n - 49) + i + l;
158 static SDATE *jalaliToGregorian(
int y,
int m,
int d)
161 long jday = jalali_jdn(y,m,d);
165 static SDATE *gregorianToJalali(
int y,
int m,
int d)
168 long jdn = civil_jdn(y,m,d);
169 sd = jdn_jalali(jdn);
172 static void gregorianToJalali(
const TQDate & date,
int * pYear,
int * pMonth,
176 sd = gregorianToJalali(date.year(), date.month(), date.day());
188 static int isJalaliLeap(
int year)
192 if (tmp == 1 || tmp == 5||tmp==9||tmp==13||tmp==17||tmp==22||tmp==26||tmp==30)
197 static int hndays(
int m,
int y)
199 return jMonthDay[isJalaliLeap(y)][m];
208 KCalendarSystemJalali::~KCalendarSystemJalali()
215 kdDebug(5400) <<
"Jalali year..." <<
endl;
217 gregorianToJalali(date, &y, 0, 0);
224 kdDebug(5400) <<
"Jalali month..." <<
endl;
226 gregorianToJalali(date, 0 , &m, 0);
233 kdDebug(5400) <<
"Jalali day..." <<
endl;
235 gregorianToJalali(date, 0, 0, &d);
242 return date.dayOfWeek();
252 return first.daysTo(date) + 1;
262 if ( m < 1 || m > 12 )
265 if ( d < 1 || d > hndays(m, y) )
268 SDATE *gd =jalaliToGregorian( y, m, d);
270 return date.setYMD(gd->year, gd->mon, gd->day);
275 TQDate result = date;
276 int y =
year(date) + nyears;
284 TQDate result = date;
307 return TQT_TQDATE_OBJECT(date.addDays( ndays ));
331 SDATE *sd = gregorianToJalali(date.year(),date.month(),date.day());
332 return hndays(sd->mon,sd->year);
345 TQDate firstDayWeek1, lastDayOfYear;
348 int weekDay1, dayOfWeek1InYear;
351 setYMD(firstDayWeek1, y, 1, 1);
357 firstDayWeek1 =
addDays(firstDayWeek1 , 7 - weekDay1 + 1);
359 dayOfWeek1InYear =
dayOfYear(firstDayWeek1);
361 if (
dayOfYear(date) < dayOfWeek1InYear )
368 setYMD(lastDayOfYear, y, 12, hndays(12, y));
378 week = firstDayWeek1.daysTo(date) / 7 + 1;
445 return TQString::null;
452 gregorianToJalali(date,0,&mon,0);
458 bool shortName )
const
464 bool shortName )
const
509 return TQString::null;
521 TQDate date(1753, 1, 1);
544 return TQString::fromLatin1(
"jalali");