| الگوريتم تبديل تاريخ ميلادي به تاريخ شمسي :
تبديل تاريخ ميلادي به شمسي بسيار راحتتر از تبديل تاريخ شمسي به ميلادي است. براي نوشتن اين الگوريتم به اختلاف روزهاي ميان اولين روز سال ميلادي و اولين روز سال شمسي نياز داريم که اين اختلاف روز (در صورتي که سال کبيسه باشد يا نباشد) "79" روز است. براي تشخيص کبيسه بودن يا نبودن سال از روش زير استفاده مي کنيم: "اگر سال داده شده بر100و 400 بخشپذير باشد" يا بر" 100 بخشپذير نباشد بر 4 بخشپذير باشد" آنگاه سال کبيسه است، در غير اين صورت سال کبيسه نيست.با توجه به کبيسه بودن يا کبيسه نبودن سال مشخص مي کنيم که در کدامين روز سال ميلادي قرار داريم.دو حالت پيش مي آيد:
• روزي که در آن قرار داريم از 79 بيشتر است به اين معني است که در ماههاي بعد از فروردين قرار داريم.حال بايد مشخص کنيم که در 6 ماه اول سال شمسي قرار داريم يا در 6 ماه دوم سال قرار داريم،براي اينکار ابتدا 79 روز از تعداد روزها کم مي کنيم تا در اول فروردين قرار بگيريم حال اگر تعداد روزها از "186" (31*6) کمتر باشد يعني در 6 ماه اول سال شمسي قرار داريم در غير اينصورت در 6 ماه دوم قرار داريم.
1. اگر در 6 ماه اول سال قرار گرفته باشيم :تعداد روزها را بر "31" تقسيم مي کنيم (6 ماه اول در سال شمسي 31 روزه است.)اگر باقيمانده اين تقسيم صفر شد خارج قسمت تقسيم برابر با ماه شمسي مي شود و روز شمسي برابر با 31 مي شود.اگر باقيمانده صفر نشود ماه شمسي برابر با خارج قسمت باضافه يک مي شود و روز شمسي همان باقيمانده است.
2. اگر در 6 ماه دوم سالقرار گرفته باشيم : "186" روز از تعداد روزها کم مي کنيم و آن را بر "30" تقسيم مي کنيم .اگرباقيمانده اين تقسيم صفر شد خارج قسمت تقسيم باضافه"6" برابر با ماه شمسي مي شودو روز شمسي برابر با30 مي شود.اگر باقيمانده صفر نشود ماه شمسي برابر با خارج قسمت باضافه "7" مي شود و روز شمسي همان باقيمانده است. سال شمسي از تفاضل سال ميلادي با "621" بدست مي آيد.
• روزي که در آن قرار داريم کمتر از "79" است : که اين به اين معني است که درروزهايي بين اولين روزسال ميلادي تا اولين روز شمسي (ماههاي دي ،بهمن و اسفند)قرار داريم.اختلاف روز بين اولين روز سال ميلادي داده شده و اولين روز دي ماه در سال شمسي را در نظر مي گيريم که اين اختلاف براي سال کبيسه"11" و براي غير کبيسه "10" است.*دقت کنيد که در اين الگوريتم براي مشخص کردن اين اختلاف بايد سال قبل از سال داده شده را در نظر بگيريم زيرا سال قبل بر روي اولين روز سال ميلادي تاثير مي گزارد.* اختلاف روز با تعداد روز محاسبه شده جمع مي کنيم ، آن را بر"30" تقسيم مي کنيم(3 ماه آخر سال شمسي 30 روزه است.). اگر باقيمانده اين تقسيم صفر شود خارج قسمت تقسيم باضافه"9" برابر با ماه شمسي مي شودو روز شمسي برابر با "30" مي شود.اگر باقيمانده صفر نشود ماه شمسي برابر با خارج قسمت باضافه"10"مي شودو روز شمسي همان باقيمانده است.در اين حالت سال شمسي از تفاضل سال ميلادي با"622" بدست مي آيد.(زيرا در سال قبل قرار داريم.)
کد کامل تبدیل تاریخ میلادی به شمسی:
Function MiladiToShamsi(var Year, Month, Day: Word): String; const count_days : array[1..12] of Byte = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); var i: Byte; st: String; day_year: Integer; begin day_year:= 0; for i:= 1 to month - 1 do day_year:= day_year + count_days[i]; day_year:= day_year + day;
if IsLeapYear(Year) and (month > 2) then Inc(day_year);
if (day_year <= 79) then begin if ((Year - 1) mod 4 = 0) then day_year:= day_year + 11 else day_year:= day_year + 10;
Year:= Year - 622;
if (day_year mod 30 = 0) then begin Month:= (day_year div 30) + 9; Day:= 30; end else begin Month:= (day_year div 30) + 10; Day:= day_year mod 30; end; end else begin year:= year - 621;
day_year:= day_year - 79; if (day_year <= 186) then begin if (day_year mod 31 = 0) then begin Month:= (day_year div 31); Day:= 31; end else begin Month:= (day_year div 31) + 1; Day:= day_year mod 31; end; end else begin day_year:= day_year - 186; if (day_year mod 30 = 0) then begin Month:= (day_year div 30) + 6; Day:= 30; end else begin Month:= (day_year div 30) + 7; Day:= day_year mod 30; end; end; end; // else .
st:= IntToStr(Year) + '/'; if (Month < 10) then st:= st + '0'; st:= st + IntToStr(Month) + '/'; if (Day < 10) then st:= st + '0'; st:= st + IntToStr(Day);
Result:= st; end;
دوستانی که بخواهند برنامه کامل تبدیل تاریخ میلادی به شمسی را دریافت کنند می توانند برنامه کامل آنرا از قسمت دانلود وبلاگ دریافت نمایند. همچنین برنامه تبدیل تاریخ شمسی به میلادی هم در بخش دانلود قرار گرفته است.
لطفا نظرات خود را در این مورد ارائه دهید تا اگر کمی و کاستی وجود داشت آن را برطرف نمائیم. نوشته شده توسط ابراهیم خدائی در یکشنبه دوم اردیبهشت 1386 ساعت 11:41 | لینک ثابت |
|