الگوریتم تبدیل تاریخ میلادی به شمسی

دوستان در مقاله قبلی الگوریتم تبدیل تاریخ شمسی به میلادی رو شرح دادم. اگر مقاله رو نخوندید میتونید از طریق لینک زیر وارد مقاله بشید و الگوریتم رو مطالعه کنید https://virgool.io/@mohsen.coder/%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%B4%D9%85%D8%B3%DB%8C-%D8%A8%D9%87-%D9%85%DB%8C%D9%84%D8%A7%D8%AF%DB%8C-bukbyq2xvid9 خب بدون مقدمه بریم سراغ الگوریتمالگوریتمبرای تبدیل تاریخ میلادی به شمسی در ابتدا ما باید تعداد کل روز های گذشته رو محاسبه کنیم. دو روش برای محاسبه وجود داره که تفاوت شون در اینه که آیا سال کبیسه هست یا نه.قرارداد: در این مقاله تاریخی که میخوایم تبدیلش کنیم به شمسی، تاریخ 2022/02/06 هست. پس هر جا از کلمه "تاریخ" به تنهایی استفاده کردم، منظورم همین تاریخ هست.نکته: اختلاف روز های اول فروردین با اول ژانویه (اولین ماه میلادی) 79 روز است.نکته: اختلاف روز های اول دی ماه با اول ژانویه، درصورتی که سال کبیسه نباشه 10 روز و درصورتی که سال کبیسه باشه 11 روز هست.قرارداد: هرجا از کلمه deyDayDiff استفاده کردیم، منظورمون اختلاف روز های اول دی ماه با اول ژانویه هست.فرض کنید میخوایم تاریخ رو به تاریخ شمسی تبدیل کنیم. در ابتدا نیازه که تعداد کل روز های گذشته رو بدست بیاریم. برای این کار از فرمول زیر استفاده میکنیمتعداد کل روز ها = مجموع روز های ماه ها + تعداد روز هانکته: برای محاسبه تعداد روز های ماه ها درصورتی که سال کبیسه نباشه از جدول زیر استفاده می کنیمنکته: برای محاسبه تعداد روز های ماه ها درصورتی که سال کبیسه باشه از جدول زیر استفاده می کنیمتوضیح جدول بالا: برای محاسبه تعداد روز ها ما باید ببینیم در 6 ماهه اول سال شمسی قرار داریم یا در 6 ماهه دوم سال. برای این کار نیاز به یک مبدا داریم که ما سپتامبر (شهریور) رو در نظر میگیریم و مجموع روز های ماه ها رو از سپتامبر به بعد حساب می کنیمنکته: چون سپتامبر مبدا هست، مجموع روز ها رو 0 در نظر می گیریمبه عنوان مثال در تاریخ بالا (2022/02/06)، تعداد روز ها برابر 6 ، و مجموع روز ها 31 هست (طبق جدول بالا مجموع روز های ماه اول و دوم 31 میشه)تعداد کل روز ها = 6 + 31تعداد کل روز ها = 37خب تعداد کل روز ها رو بدست آوردیم، حالا باید چک کنیم که آیا تعداد کل روز ها از 79 کمتر هست یا نه؟اگر تعداد کل روز ها از 79 کمتر باشه:در اینصورت تعداد کل روز ها رو با deyDayDiff جمع می کنیماگر باقیمانده تقسیم تعداد روز ها بر 30 برابر 0 شد:در اینصورت ماه شمسی از فرمول زیر بدست میاد:ماه شمسی = 9 + (30 / تعداد روز ها)روز شمسی هم برابر 30 هست.اگر باقیمانده تقسیم تعداد روز ها بر 30 بزرگ تر از 0 شد:در اینصورت ماه شمسی از فرمول زیر بدست میاد:ماه شمسی = 10 + (30 / تعداد روز ها)روز شمسی = باقیمانده تقسیم (30 / تعداد روز ها)حالا برای بدست آوردن سال شمسی از فرمول زیر استفاده می کنیم:سال شمسی = 622 - سال میلادیاگر تعداد روز ها از 79 بیشتر باشه:در اینصورت از کل روز ها 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 شد.