دوستان در مقاله قبلی الگوریتم تبدیل تاریخ شمسی به میلادی رو شرح دادم. اگر مقاله رو نخوندید میتونید از طریق لینک زیر وارد مقاله بشید و الگوریتم رو مطالعه کنید
خب بدون مقدمه بریم سراغ الگوریتم
برای تبدیل تاریخ میلادی به شمسی در ابتدا ما باید تعداد کل روز های گذشته رو محاسبه کنیم. دو روش برای محاسبه وجود داره که تفاوت شون در اینه که آیا سال کبیسه هست یا نه.
فرض کنید میخوایم تاریخ رو به تاریخ شمسی تبدیل کنیم. در ابتدا نیازه که تعداد کل روز های گذشته رو بدست بیاریم. برای این کار از فرمول زیر استفاده میکنیم
تعداد کل روز ها = مجموع روز های ماه ها + تعداد روز ها
توضیح جدول بالا: برای محاسبه تعداد روز ها ما باید ببینیم در 6 ماهه اول سال شمسی قرار داریم یا در 6 ماهه دوم سال. برای این کار نیاز به یک مبدا داریم که ما سپتامبر (شهریور) رو در نظر میگیریم و مجموع روز های ماه ها رو از سپتامبر به بعد حساب می کنیم
نکته: چون سپتامبر مبدا هست، مجموع روز ها رو 0 در نظر می گیریم
به عنوان مثال در تاریخ بالا (2022/02/06)، تعداد روز ها برابر 6 ، و مجموع روز ها 31 هست (طبق جدول بالا مجموع روز های ماه اول و دوم 31 میشه)
تعداد کل روز ها = 6 + 31
تعداد کل روز ها = 37
خب تعداد کل روز ها رو بدست آوردیم، حالا باید چک کنیم که آیا تعداد کل روز ها از 79 کمتر هست یا نه؟
در اینصورت تعداد کل روز ها رو با deyDayDiff جمع می کنیم
اگر باقیمانده تقسیم تعداد روز ها بر 30 برابر 0 شد:
در اینصورت ماه شمسی از فرمول زیر بدست میاد:
ماه شمسی = 9 + (30 / تعداد روز ها)
روز شمسی هم برابر 30 هست.
اگر باقیمانده تقسیم تعداد روز ها بر 30 بزرگ تر از 0 شد:
در اینصورت ماه شمسی از فرمول زیر بدست میاد:
ماه شمسی = 10 + (30 / تعداد روز ها)
روز شمسی = باقیمانده تقسیم (30 / تعداد روز ها)
حالا برای بدست آوردن سال شمسی از فرمول زیر استفاده می کنیم:
سال شمسی = 622 - سال میلادی
در اینصورت از کل روز ها 79 تا کم می کنیم
اگر روز های باقیمانده کمتر مساوی 186 باشه یعنی در نیمه اول سال قرار داریم:
اگر باقیمانده تقسیم روز ها به 31 برابر 0 شد:
ماه شمسی = 31 / تعداد روز ها
روز شمسی = 31
اگر باقیمانده تقسیم روز ها به 31 بزرگتر از 0 شد:
ماه شمسی = 1 + (31 / تعداد روز ها)
روز شمسی = باقیمانده تقسیم (31 / تعداد روز ها)
سال شمسی = 621 - سال میلادی
اگر روز های باقیمانده بیشتر از 186 باشه یعنی در نیمه دوم سال قرار داریم:
186 روز از تعداد کل روز ها کم می کنیم.
اگر باقیمانده تقسیم روز ها به 30 برابر 0 شد:
ماه شمسی = 6 + (30 / تعداد روز ها)
روز شمسی = 30
اگر باقیمانده تقسیم روز ها به 30 بزرگتر از 0 شد:
ماه شمسی = 7 + (30 / تعداد روز ها)
روز شمسی = باقیمانده تقسیم (30 / تعداد روز ها)
سال شمسی = 621 - سال میلادی
در دو حالت سال کبیسه هست:
حالت اول: باقیمانده تقسیم سال بر 4 باید برابر 0 بشه و باقیمانده تقسیم سال بر 100 باید بیشتر از 0 باشه.
حالت دوم: باقیمانده تقسیم سال بر 400 باید برابر 0 بشه و باقیمانده سال تقسیم بر 100 باید برابر 0 بشه.
فرض کنید میخوایم تاریخ 2022/02/06 رو به تاریخ شمسی تبدیل کنیم.
تعداد کل روز ها = 6 + 31
تعداد کل روز ها = 37
چون تعداد کل روز ها از 79 کمتر هست پس:
تعداد روز ها = تعداد کل روز ها + deyDayDiff
تعداد روز ها = 37 + 10 ( چون سال کبیسه نیست)
تعداد روز ها = 47
باقیمانده تقسیم 30 / 47 بزرگ تر از 0 هست، پس:
ماه شمسی = 10 + (30 / تعداد روز ها)
ماه شمسی = 10 + (30 / 47)
ماه شمسی = 11
روز شمسی = باقیمانده تقسیم (30 / تعداد روز ها)
روز شمسی = 17
سال شمسی = 622 - سال میلادی
سال شمسی = 622 - 2022
سال شمسی = 1400
پس تاریخ شمسی معادل 2022/02/06، 1400/11/17 شد.