تقویم جلالی در کیوت ۴٫۹
-
@
QString JalaliCalendar::jDate()
{
QDate Today;
QDate chkFirst,chkSecound;
Today = QDate::currentDate();
chkFirst.setDate(Today.year(),2,1);
chkSecound.setDate(Today.year(),3,1);
int IsKabisah = (chkFirst.daysTo(chkSecound))==29 ? 1 : 0 ;
QString jsYear,jsMonth,jsDay;
int jYear,jMonth,jDay;
QString space=" / ";if(Today > QDate(Today.year(),3,20-IsKabisah) && Today <=QDate(Today.year(),4,20-IsKabisah)) { jYear = Today.year()-621; jMonth =1;jDay=Today.daysTo(QDate(Today.year(),3,20-IsKabisah));} //فروردین if(Today > QDate(Today.year(),4,20-IsKabisah) && Today <=QDate(Today.year(),5,21-IsKabisah)) { jYear = Today.year()-621; jMonth =2;jDay=Today.daysTo(QDate(Today.year(),4,20-IsKabisah));} //اردیبهشت if(Today > QDate(Today.year(),5,21-IsKabisah) && Today <=QDate(Today.year(),6,21-IsKabisah)) { jYear = Today.year()-621; jMonth =3;jDay=Today.daysTo(QDate(Today.year(),5,21-IsKabisah));} //خرداد if(Today > QDate(Today.year(),6,21-IsKabisah) && Today <=QDate(Today.year(),7,22-IsKabisah)) { jYear = Today.year()-621; jMonth =4;jDay=Today.daysTo(QDate(Today.year(),6,21-IsKabisah));} //تیر if(Today > QDate(Today.year(),7,22-IsKabisah) && Today <=QDate(Today.year(),8,22-IsKabisah)) { jYear = Today.year()-621; jMonth =5;jDay=Today.daysTo(QDate(Today.year(),7,22-IsKabisah));} //مرداد if(Today > QDate(Today.year(),8,22-IsKabisah) && Today <=QDate(Today.year(),9,23-IsKabisah)) { jYear = Today.year()-621; jMonth =6;jDay=Today.daysTo(QDate(Today.year(),8,22-IsKabisah));} //شهریور if(Today > QDate(Today.year(),9,22-IsKabisah) && Today <=QDate(Today.year(),10,22-IsKabisah)) { jYear = Today.year()-621; jMonth =7;jDay=Today.daysTo(QDate(Today.year(),9,22-IsKabisah));} //مهر if(Today > QDate(Today.year(),10,22-IsKabisah) && Today <=QDate(Today.year(),11,21-IsKabisah)) { jYear = Today.year()-621; jMonth =8;jDay=Today.daysTo(QDate(Today.year(),10,22-IsKabisah));} //آبان if(Today > QDate(Today.year(),11,21-IsKabisah) && Today <=QDate(Today.year(),12,21-IsKabisah)) { jYear = Today.year()-621; jMonth =9;jDay=Today.daysTo(QDate(Today.year(),11,21-IsKabisah));} //آذر if(Today > QDate(Today.year(),12,21-IsKabisah) && Today <=QDate(Today.year(),1,20-IsKabisah)) { jYear = Today.year()-621; jMonth =10;jDay=Today.daysTo(QDate(Today.year(),12,21-IsKabisah));} //دی if(Today > QDate(Today.year(),1,20-IsKabisah) && Today <=QDate(Today.year(),2,19-IsKabisah)) { jYear = Today.year()-(Today.day()>11+IsKabisah)?622:621; jMonth =11;jDay=Today.daysTo(QDate(Today.year(),1,20-IsKabisah));} //بهمن if(Today > QDate(Today.year(),2,19-IsKabisah) && Today <=QDate(Today.year(),4,20-IsKabisah)) { jYear = Today.year()-622; jMonth =12;jDay=Today.daysTo(QDate(Today.year(),2,19-IsKabisah));} //اسفند jsYear = QString::number(jYear); jsMonth = QString::number(jMonth); jsDay = QString::number(-jDay); return jsYear +space+ jsMonth +space+ jsDay;
}
@ -
:)
-
p{direction:rtl;text-align:right}. این دیگه چجور الگوریتمیه!
-
کاملا" وابسته به تاریخ میلادی سیستم هستش
اول چک می کنیم که سال کبیسه هست یا نه
بعد بر اساس این تشخیص ماه های سال مشخص می شن
خیلی ساده و راحت
فقط باید تاریخ خود سیستم درست ست شده باشه
آلگوریتمشو خودم نوشتم
و تستش کردم اگر اشتباهی مشاهده کردید لطفا" بهم اطلاع بدید
توی تستی که کردم خطا نداشت -
p{direction:rtl; text-align:right}. ببخشید ولی اصلا جالب نیست. البته نظر شخصیه منه. 12 بار مقایسه تاریخ، بارگذاری اینهمه آبجکت و استفاده از فانکشن های محاسباتی زیاد فقط برای تبدیل تاریخ! سال های کبیسه با فرمول قابل تشخیص هستند و نیازی به اینکار نیست. به نظرم کمی در مورد الگوریتم های تبدیل تاریخ مطالعه کنید و یک فانکشن تمیز، منطقی و با سرعت بنویسید.
-
ممنون از راهنماییتون . البته می تونستم ساده ترش کنم . فقط بخاطر اینکه گویا باشه اینکارو نکردم . ولی فکر می کنم این سرعتش از بقیه الگوریتم ها بیشتر باشه . چون فقط تو بازه مقایسه ای قرار می گیره. قبول دارم که تکنیکی نیست . اما دلیلی ندیدم که بخوام تاریخی رو محاسبه کنم که پایه اون همون تاریخ میلادی هستش که سیستم رو خودش داره. چون به هر حال همه می دونیم اساسا" تاریخ شمسی روی سیستم ها پایه گذاری نشده.
البته دو سه تا آبجکت بیشتر نیست و فکر نمی کنم زیاد باشه :)
موفق باشید -
p{direction:rtl; text-align:right}. این الگوریتم غلطه. خیلی چیزها درنظر گرفته نشده. مثلاً این که هر سی و سه سال یک بار سال کبیسه نداریم. و این که هر صد و بیست و هفت سال یکبار دو سال کبیسهٔ پشت سر هم داریم. همچنین تداخل این نوع محاسبات با سالهای کبیسهٔ میلادی و روزهای گمشدهٔ گریگوری درنظر گرفته نشده.
p{direction:rtl; text-align:right}. ساده بگم، این الگوریتم برای قبل از سال ۷۵ شمسی و بعد از سال ۲۰۱۷ میلادی یکی دو روز جابجایی خواهد داشت.
-
سروش عزیز سلام
این الگوریتم کاملا" به تاریخ تنظیم شده سیستم وابسته هستش!
اگر توی سیستم کبیسه تعریف نشده باشه این الگوریتم هم از خودش تعریفی نخواهد داشت.
به نظرم خیلی توجه نکردید.
ممنون از نظرتون -
[quote author="Ramin7000" date="1354184526"]سروش عزیز سلام
این الگوریتم کاملا" به تاریخ تنظیم شده سیستم وابسته هستش!
اگر توی سیستم کبیسه تعریف نشده باشه این الگوریتم هم از خودش تعریفی نخواهد داشت.
به نظرم خیلی توجه نکردید.
ممنون از نظرتون[/quote]p{direction:rtl; text-align:right}. مسأله اینه که توی تاریخ سیستم کبیسهها درنظر گرفته شدن. اگه میخوای یه الگوریتم خوب بنویسی یه همچین کدی نیاز داری:
@
bool QJalaliDate::isLeapYear(const int& year)
{
int a = (year + 2345) % 2820;
if(a == 2819)
return true;
else
{
int b = a8;
int c;
if(b < 29)
c = b;
else
c = (b-29) % 33;
if(c==0)
return false;
else if(c%4 == 0)
return true;
else
return false;
}
}
@ -
تا اونجا که یادمه تقویم هایی که وابسته به میلادی هستند همیشه یه جایی سوتی میدن. خیام طبق یه الگوریتم اومده در مورد تقویم جلالی یه حرفهایی زده که هر ۱۸۲۰ سال تغییر ناپذیره و این حرفها. یه دوست ایرانی که هنوز هم ایرانه چنین کدی رو سالهاست نوشته:
http://savannah.nongnu.org/projects/jcal/
همون دستور cal لینوکسه