babakhani / PersianDate

javascript date library for parsing, validating, manipulating, and formatting persian dates System.
http://babakhani.github.io/PersianWebToolkit/doc/persian-date/
Other
559 stars 102 forks source link

عدم نمایش درست سال کبیسه #143

Open mohammadasaddev opened 6 months ago

mohammadasaddev commented 6 months ago

با سلام

اسفند 1403 در تقویم 30 روز است اما در دیت پیکر 29 روز در حال نمایش است

hamidroozkhosh commented 6 months ago

سلام این مشل به دلیل خطا در نوع الگوریتم محاسبه سال کبیسه می باشد و با تغییر الگوریتم از algorithmic به astronomical مشکل بر طرف می شود.

calendar: {
  persian: {
    leapYearMode: 'algorithmic'
  }
},

calendar: {
  persian: {
    leapYearMode: 'astronomical'
  }
}
devdevi1331 commented 5 months ago

سلام آیا روی روشهای دیگر و با خروجی قابل اطمینان تری برای محاسبه سالهای کبیسه بررسی صورت گرفته است؟ در حال حاضر روش پیشفرض در کتابخانه های persianDate و persianDatepicker برای محاسبه سال کبیسه بر روی algorithmic تنظیم شده است. آیا دلیلی برای این انتخاب وجود دارد؟ با مشاهده خروجی های سالهای مختلف مشاهده می شود که در هر دو حالت algorithmic و astronomical سالهایی وجود دارند که به اشتباه کبیسه تشخیص داده شده/نشده اند. یکی از سایر روشها برای تشخیص سال کبیسه بین سالهای 1343 تا 1472، روش محاسبه باقیمانده عدد سال تقسیم بر عدد 33 می باشد. و اگر باقیمانده یکی از اعداد 1, 5, 9, 13, 17, 22, 26, 30 باشد آن سال به عنوان کبیسه محاسبه می شود. (برای محاسبه سالهای 1244 تا 1342 به جای 22 در لیست باقیمانده ها، باید عدد 21 را چک کنیم.

for (let i = 1343; i <= 1498; i++) {
    const leapInAlgoritmic = new persianDate([i]).toLeapYearMode('algorithmic').isLeapYear();
    const leapInAstronomical = new persianDate([i]).toLeapYearMode('astronomical').isLeapYear();
    const leapInMathematical = [1, 5, 9, 13, 17, 22, 26, 30].includes(i % 33);
    if (leapInAlgoritmic || leapInAstronomical || leapInMathematical) {
        if (leapInAlgoritmic && leapInAstronomical && leapInMathematical) {
            console.log(i+ ', All true');
        } else {
            console.log(i+ ', Algoritmic: ' + leapInAlgoritmic + ', Astronomical: ' + leapInAstronomical + ', Mathematical: ' + leapInMathematical)
        }
    }
}

با توجه به خروجی کد بالا و مقایسه آن با سالهای کبیسه مرجع (سالهای عادی و کبیسه محاسبه شده از سال 1206 تا سال 1498 توسط مرکز تقویم مؤسسه ژئوفیزیک دانشگاه تهران)که در تمامی موارد بین سالهای 1343 تا 1498 سال کبیسه با روش mathematical به درستی تشخیص داده شده است، پیشنهاد می کنم یک حالت mathematical نیز به کتابخانه اضافه شود و همچنین از آنجایی که در عصر حاضر، اکثر کاربردهای این دو کتابخانه بین این سالهاست، پیشفرض persianDate و persianDatepicker بر روی آن تنظیم شود.