PDA

View Full Version : تشخیص سال کبیسه شمسی



SamadYousefi
دوشنبه 08 آبان 1385, 11:32 قبل از ظهر
function IsLeapYear(Year: Word): Boolean;
begin
Result:= SysUtils.IsLeapYear(Year +1);
end;

Mohammad_Mnt
دوشنبه 08 آبان 1385, 13:08 بعد از ظهر
اشتباه محض :)
سیستم کبیسه میلادی : هر چهار سال یک بار، به جز سال هایی که به 100 بخش پذیر باشند ولی به 400 بخش پذیر نباشند ( 2000 کبیسه است )
سیستم کبیسه خورشیدی : باقیمانده تقسیم سال به 33 یکی از این عدد ها باشد : 1 و 5 و 9 و 13 و 17 و 22 و 26 و 30

morteza_1234m
چهارشنبه 10 آبان 1385, 09:31 قبل از ظهر
میشه بیشتر توضیح بدید یا یک مثال بزنید

Mohammad_Mnt
چهارشنبه 10 آبان 1385, 16:24 بعد از ظهر
میلادی :
سال 2000 : به 4 بخش پذیره ، به 100 بخش پذیره و به 400 هم بخش پذیره پس کبیسه است
سال 2100 : به 4 بخش پذیره ، به 100 بخش پذیره ولی به 400 بخش پذیر نیست پس کبیسه نیست

هجری خورشیدی :
سال 1383 : باقیمانده تقسیم 1383 بر 33 می شود 30 ، پس کبیسه است
سال 1385 : باقیمانده تقسیم 1383 بر 33 می شود 32 ، پس کبیسه نیست

ghabil
پنجشنبه 11 آبان 1385, 02:31 قبل از ظهر
سیستم کبیسه میلادی : هر چهار سال یک بار، به جز سال هایی که به 100 بخش پذیر باشند ولی به 400 بخش پذیر نباشند ( 2000 کبیسه است )


برای میلادی که تابع IsLeapYear هست که خودش محاسبه میکنه ،دقیقا به همین روشی که دوستمون گفتن (قسمت دوم رو بولینی ریورس کنید میشه چیزی که گفت) (توی یونیت SysUtils)



function IsLeapYear(Year: Word): Boolean;
begin
Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));
end;


نکته مهم اینه که خیلی دیگه از توابع Date از این تابع استفاده میکنند و اگر براتون مهمه که تفاوتهای شمسی با میلادی در سالهای کبیسه رو داشته باشید باید او هارو هم دوباره بنویسید : مثلا تابع WeeksInYear که البته بنظر م که اصولا اینا قابل چشم پوشی هستند...

Mohammad_Mnt
پنجشنبه 11 آبان 1385, 12:47 بعد از ظهر
این هم که من نوشتم کاملا" دقیق نیست. فکر کنم اطراف سال 1600 هجری خورشیدی اشتباه جواب میده

SamadYousefi
یکشنبه 14 آبان 1385, 11:11 قبل از ظهر
با تشکر از همه دوستان ،
آنچه که در مورد سال کبیسه میلادی مطرح کردید کاملا صحیح است ولی اگر به تقویم نگاه کنیم می بینیم که سال بعد از سال کبیسه میلادی ، سال کبیسه شمسی است و سه سال بعد از سال کبیسه شمسی سال کبیسه میلادی است .
مثال
میلادی( عادی) شمسی ( کبیسه)
----------------------------------------
2005 1383
توضیح 1- سال 2004 کبیسه بوده است
2- سال 1384 میلادی سال کبیسه است
3- اگر سال 1383 سال میلادی فرض شود پس داریم 1384 = 1 + 1383

Mohammad_Mnt
دوشنبه 15 آبان 1385, 00:49 قبل از ظهر
با یک مثال نقض این فرمول رو می شه رد کرد :
می خواهیم بدانیم سال 1370 کبیسه است یا نه :
طبق فرمول شما: 1371 = 1 + 1370 و سال 1371 میلادی کبیسه نیست پس نتیجه می گیریم که سال 1370 هجری خورشیدی کبیسه نیست !
ولی در واقع سال 1370 کبیسه است !

محمد دادودنیا
پنجشنبه 25 آبان 1385, 01:34 قبل از ظهر
با سلام
چرا دعوا دارید با اینم تابع کاملش

Function MiladyToShamsi(var d,m,y:integer;Const DelChar:char='/'):String;
var
ny,nd,nm,dd:integer;
begin
ny:=0;
nd:=0;
nm:=0;
dd:=0;
ny:=y-621;
if m<3 then ny:=ny-1;
if (m=3) and (d<=20) then ny:=ny-1;
dd:=0;
if m=1 then dd:=d;
if m=2 then dd:=31+d;
if m=3 then dd:=31+28+d;
if m=4 then dd:=31+28+31+d;
if m=5 then dd:=31+28+31+30+d;
if m=6 then dd:=31+28+31+30+31+d;
if m=7 then dd:=31+28+31+30+31+30+d;
if m=8 then dd:=31+28+31+30+31+30+31+d;
if m=9 then dd:=31+28+31+30+31+30+31+31+d;
if m=10 then dd:=31+28+31+30+31+30+31+31+30+d;
if m=11 then dd:=31+28+31+30+31+30+31+31+30+31+d;
if m=12 then dd:=31+28+31+30+31+30+31+31+30+31+30+d;
if m<3 then dd:=dd+(366-80);
if m>3 then dd:=dd-79;
if (m=3) and (d<=20) then dd:=dd+(366-80);
if (m=3) and (d>20) then dd:=dd-79;
if (dd>=1) and (dd<=(6*31)) then
begin
nm:=(dd div 31);
nd:=(dd-(nm*31));
IF nd=0 Then nd:=31;
IF (nm<6) And (nd<>31) Then nm:=nm+1;
end
Else
if dd>186 then
begin
dd:=dd-186;
nm:=7+dd div 30;
nd:=dd mod 30;
if nd=0 then
begin
nd:=30;
nm:=nm-1;
end;
end;
d:=nd;
y:=ny;
m:=nm;
Result:=inttostr(y)+DelChar+AddZeroToFirst(inttost r(m),2)+DelChar+AddZeroToFirst(inttostr(d),2);
End;

Mohammad_Mnt
پنجشنبه 25 آبان 1385, 10:22 قبل از ظهر
برای دریافت کد به زبان های
C
PHP
JavaScript
#C
Texبه این سایت (http://fa.farsiweb.ir/fawiki/Iranian_Calendar)بروید

hmahdavi921
چهارشنبه 09 مهر 1393, 16:59 بعد از ظهر
در تقویم هجری خورشیدی (http://fa.wikipedia.org/wiki/%D8%AA%D9%82%D9%88%DB%8C%D9%85_%D9%87%D8%AC%D8%B1% DB%8C_%D8%AE%D9%88%D8%B1%D8%B4%DB%8C%D8%AF%DB%8C) علاوه بر کبیسه چهارساله، طبق محاسبات نجومی، برای تعدیل دقیقتر (کاستن کبیسه‌ها)، فاصله بعضی کبیسه‌ها یک‌روز بیشتر می‌شود و در هر دورهٔ ۲۹ یا ۳۳ یا ۳۷ ساله، یک کبیسه پنج‌ساله (بجای چهارساله) در آغاز محقق می‌شود.
برای تشخیص کبیسه بودن سال‌های هجری خورشیدی حسابی (http://fa.wikipedia.org/wiki/%DA%AF%D8%A7%D9%87%E2%80%8C%D8%B4%D9%85%D8%A7%D8%B 1%DB%8C_%D9%87%D8%AC%D8%B1%DB%8C_%D8%AE%D9%88%D8%B 1%D8%B4%DB%8C%D8%AF%DB%8C_%D8%AD%D8%B3%D8%A7%D8%A8 %DB%8C) شیوه یکنواخت وجود دارد اما در گاهشماری رسمی ایران (http://fa.wikipedia.org/wiki/%DA%AF%D8%A7%D9%87%D8%B4%D9%85%D8%A7%D8%B1%DB%8C_% D8%B1%D8%B3%D9%85%DB%8C_%D8%A7%DB%8C%D8%B1%D8%A7%D 9%86) شیوه کاملاً یکنواختی وجود ندارد. چنانچه باقی‌ماندهٔ حاصل تقسیم سال مورد نظر بر عدد ۳۳، یکی از اعداد (۱، ۵، ۹، ۱۳، ۱۷، ۲۲، ۲۶ و ۳۰) باشد،[۱] (http://fa.wikipedia.org/wiki/%D8%B3%D8%A7%D9%84_%DA%A9%D8%A8%DB%8C%D8%B3%D9%87# cite_note-1) برای سال‌های بین ۱۲۴۴ تا ۱۳۴۲، آن سال کبیسه است و برای سال‌های ۱۳۴۳ تا ۱۴۷۲ به‌جای ۱۷، باقی‌ماندهٔ ۱۸ ملاک خواهد بود و برای دیگر سال‌ها نیز به مراتب تفاوت‌هایی در اعداد هشتگانه فوق وجود دارد. به عنوان مثال سال ۱۳۹۱ سالی کبیسه است چراکه باقی‌ماندهٔ تقسیم آن بر عدد ۳۳ برابر عدد ۵ است.