محسن فلاح نژاد
محسن فلاح نژاد
خواندن ۴ دقیقه·۳ سال پیش

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


دوستان در این مقاله قصد دارم نحوه تبدیل تاریخ شمسی به میلادی رو برای شما توضیح بدم ولی در ابتدا میخوام بگم که چی شد که من سراغ یادگیری این الگوریتم رفتم:

بعد از ورود من به برنامه نویسی اندروید و یادگیری آموزش های لازم تصمیم گرفتم اولین اپلیکیشن موبایلم رو تولید کنم و مثل هر برنامه نویس دیگه ای شروع کردم به نوشتن یک اپ لیست کار های روزانه (todo list)، یکی از قابلیت هایی که میخواستم به اپم اضافه کنم، قابلیت تعیین تاریخ انجام اون کار توسط کاربر بود. در اینجا بود که من نیاز داشتم به یک کتابخونه تبدیل تاریخ شمسی به تاریخ میلادی یا timestamp. خب برای رفع نیازم اولین کاری که کردم جستجو کردن برای یک کتابخونه بود که نیازم رو برطرف کنه، خیلی جستجو کردم ولی کتابخونه مورد نظرم رو پیدا نکردم (یا کتابخونه خیلی قدیمی بود و درست کار نمیکرد یا پیچیده بود) خلاصه تصمیم گرفتم خودم یک کتابخونه کاربردی درست کنم که استفاده ازش خیلی ساده باشه و اینطوری شد که به دنبال یادگیری الگوریتم های تبدیل تاریخ شمسی به میلادی و برعکس رفتم.

در این مقاله الگورتیم تبدیل تاریخ شمسی به میلادی رو توضیح میدم و در مقاله دیگه الگوریتم تبیدل تاریخ میلادی به شمسی رو توضیح میدم


الگوریتم

خب بریم سراغ الگوریتم.

برای تبدیل سال شمسی به میلادی باید سال شمسی رو با عدد 621 جمع کنیم

برای بدست آوردن ماه و روز میلادی ما ابتدا نیاز داریم تعداد روز های گذشته از اول فروردین رو بدست بیاریم

برای اینکار ابتدا باید ببینیم در 6 ماه اول سال هستیم یا در 6 ماه دوم سال

اگر در 6 ماه اول سال بودیم:

یک واحد از ماه شمسی کم می کنیم و حاصل رو در 31 ضرب میکنیم و با روز شمسی جمع میکنیم

مثلا اگر در تاریخ 23 اردیبهشت باشیم، (1 - 2) رو در 31 ضرب می کنیم و حاصل رو با 23 جمع می کنیم

اگر در 6 ماه دوم سال بودیم:

1- 6 (شش ماه اول سال) رو در 31 ضرب می کنیم

2- 7 واحد از ماه شمسی کم می کنیم و حاصل رو در 30 ضرب میکنیم

3- مراحل 1 و 2 را با تعداد روز های شمسی جمع میکنیم

مثلا اگر در تاریخ 16 بهمن باشیم:

تعداد کل روز های گذشته = تعداد روز ها + (30 * (7 - 11)) + (31 * 6)


نکته: اول دی ماه با اول ماه مارس (اولین ماه سال میلادی) 11 روز اختلاف دارن، اگر سال کبیسه باشه این اختلاف 12 روز میشه! (در انتهای مقاله نحوه محاسبه سال کبیسه رو بهتون میگم)

قرارداد: از این جای مقاله به بعد هرجا نوشتیم janDeyDiff منظورمون اختلاف اول دی ماه و اول ماه ژانویه هست.


خب حالا که تعداد کل روز های گذشته شده رو بدست آوردیم، باید چک کنیم آیا تعداد روز های گذشته از marchDeyDiff کمتر هست یا نه

اگر تعداد روز های گذشته، از janDeyDiff کمتر باشه:

در این حالت ماه میلادی برابر 3 است، یعنی در سومین ماه میلادی (March) قرار داریم

برای محاسبه روز میلادی هم از فرمول زیر استفاده می کنیم

اگر تعداد روز های گذشته، از janDeyDiff بیشتر باشه:

ابتدا از تعداد کل روز ها، janDeyDiff رو کم می کنیم تا تعداد روز های باقیمانده بدست بیاد

حالا اگر سال کبیسه نباشه، از اولین ماه میلادی شروع میکنیم و تعداد روز های هر ماه رو از روز های باقیمانده کم می کنیم تا زمانی که تعداد روز های باقیمانده از تعداد روز های ماه میلادی کمتر باشه.

احتمالا گیج شده باشید پس نیاز به یک مثال داریم.

فرض کنید تعداد کل روز های ماه 100 روز است، از این 100 روز 11 روز کم می کنیم، میشه 89 روز

خب حالا نوبت به کم کردن تعداد روز های ماه های میلادی از این 89 روز هست

ماه اول میلادی (ژانویه) 30 روز هست، پس از 89 روز، 30 روز کم می کنیم که حاصل 59 روز میشه

ماه دوم میلادی (فوریه) 31 روز هست، پس از 59 روز، 31 روز کم می کنیم که حاصل 28 روز میشه

ماه سوم میلادی (مارس) 30 روز هست، چون 30 از 28 بزرگتر هست پس دیگه عملیات رو ادامه نمیدیم

به این ترتیب روز میلادی ما بدست میاد

نکته: در سال کبیسه یازدهمین ماه میلادی (نوامبر) بحای اینکه 28 روز باشه، 29 روز هست.

اگر سال کبیسه باشه:

برای سال کبیسه هم عملیات بالا رو انجام میدیم فقط باید حواسمون به نکته بالا باشه که وقتی به نوامبر رسیدیم تعداد روز هاش رو 29 روز درنظر بگیریم


برای بدست آوردن ماه میلادی دو حالت وجود داره:

حالت اول (عملیات بالا رو کمتر یا مساوی 8 بار انجام داده باشیم):

ماه میلادی = تعداد باری که عملیات بالا رو انجام دادیم + 4
مثلا اگه 5 بار عملیات بالا رو انجام دادیم، 9 = 5 + 4

که ماه میلادی میشه سپتامبر (نهمین ماه میلادی)

حالت دوم (عملیات رو بیشتر از 8 بار انجام داده باشیم):

ماه میلادی = 8 - تعداد باری که عملیات بالا رو انجام دادیم
مثلا اگه 11 بار عملیات بالا رو انجام داده باشیم، 3 = 8 - 11

که ماه میلادی میشه مارس (سومین ماه میلادی)

در این حالت به سال میلادی هم 1 واحد اضافه می کنیم

تمام.


خب الگوریتم ما تموم شد و تونستیم سال، ماه و روز میلادی رو بر اساس تاریخ شمسی محاسبه کنیم.


نحوه تشخیص سال کبیسه

در دو حالت سال کبیسه هست:

حالت اول: باقیمانده تقسیم سال بر 4 باید برابر 0 بشه و باقیمانده تقسیم سال بر 100 باید بیشتر از 0 باشه.

حالت دوم: باقیمانده تقسیم سال بر 400 باید برابر 0 بشه و باقیمانده سال تقسیم بر 100 باید برابر 0 بشه.


جهت مشاهده نمونه کد میتونید وارد لینک زیر بشید:

https://github.com/Mohsen-code/kotlin-persian-date-time/blob/master/src/jvmMain/kotlin/mohsen/coder/JalaliToGregorian.kt

الگوریتمسالشمسیمیلادیمحاسبه
برنامه نویس - عاشق یادگیری - معتقدم هر چیزی رو که بلدم باید به دیگران هم انتقال بدم
شاید از این پست‌ها خوشتان بیاید