Skip to content
 

الگوریتم گاهشماری ایران برای نرم‌افزارهای مبدل تقویم‌ها

برای تبدیل متقابل گاهشماری ایران به دیگر تقویم‌ها نرم‌افزارهای گوناگونی وجود دارد که هر یک از آنها محاسن و معایبی در قیاس با یکدیگر دارند. مهم‌ترین کمبود بیشتر نرم‌افزارها، بهره‌گیری از الگوریتم‌هایی با دامنه خطای بالا و کم‌کارآمد، دامنه کوتاه مدت سال‌های تطبیق‌پذیر و بسنده‌کردن به تبدیل تقویم هجری شمسی با تقویم میلادی گریگوری است.

الگوریتم زیر را که در بسیاری از برنامه‌های تبدیلی تقویم‌ها بکار می‌رود، مارک جیسون دومینوس (Mark Jason Dominus) به زبان برنامه‌نویسی «پرل» (Perl) نوشته و جان واکر John Walker شکل توسعه یافته آنرا را در برنامه Formilab بکار گرفته و نیز در Calendar Home از آن اقتباس شده است. (برای استفاده عملی از این الگوریتم به نرم‌افزار تبدیل تقویم‌ها مراجعه کنید).

نگارنده این دو برنامه را که از الگوریتم یکسانی بهره گرفته‌اند، برای دویست سال گوناگون در یک دامنه پنج‌هزار ساله که از ترکیب‌های کبیسه‌ متنوعی برخوردار بوده‌اند، آزمایش کرده و به نتیجه نادرستی برخورد نکرده است. این آزمایش برای تبدیل تقویم هجری شمسی و بالعکس به میلادی ژولی، میلادی گریگوری، هجری قمری، عبرانی و روز ژولی انجام شد.

یادآور می‌شود که برای داده‌های تاریخی که نتیجه تبدیل آنها به تقویم میلادی یا برعکس، سال‌های پیش از ۱۵۸۲ میلادی باشد، می‌باید به دستگاه میلادی ژولی (و نه میلادی گریگوری) رجوع کرد. همچنین برای برخی داده‌های تاریخی پس از سال ۱۵۸۲ نیز می‌باید به تقویم میلادی ژولی مراجعه کرد. چرا که تقویم گریگوری در زمانی یکسان در همه کشورها پذیرفته نشده و رویدادهای تاریخی در آن کشورها گاه تا چند سده بعد همچنان به تقویم میلادی ژولی ثبت شده‌اند. این دو نکته، از خطاهای متداول در تبدیل تقویم‌ها است. خطای متداول دیگر، بی‌توجهی به وجود سال صفر در گاهشماری میلادی گریگوری است. چنانچه کاربر به هر دلیلی قصد داشته باشد رویداد خاصی را با تعمیم تقویم میلادی گریگوری به گذشته به دست آورد، می‌باید این نکته را در نظر داشت که این گاهشماری دارای سال صفر تعریف‌شده (برابر با سال ۱- ژولی) است. به عبارت دیگر برای سال‌های پیش از مبدأ میلادی، تفاوتی یک ساله در سالشماری میلادی گریگوری و ژولی وجود دارد.

۱. Let a = (y + 2345) % 2820
۲. If a is 2819, y is a leap year. Otherwise,
۳. Let b = a % 128.
۴. If b < 29, let c = b. Otherwise, let c = (b – 29) % 33.
۵. If c = 0, y is not a leap year. Otherwise,
۶. If c is a multiple of 4, y is a leap year. Otherwise,
۷. y is not leap year.
——————————
#!/usr/bin/perl

# is Persian year y a leap year in the Persian calendar?
sub is_leap_year {
my $y = shift;
my $a = ($y + 2345) % 2820;

return 1 if $a == 2819;

my $b = $a % 128;
my $c;
if ($b < 29) { $c = $b }
else { $c = ($b – 29) % 33 }
return 0 if $c == 0;
return 1 if $c %4 == 0;
return 0;
}

# Is Gregorian year g a leap year ** in the Persian calendar **?
sub is_gregorian_leap_year {
my $g = shift;
return is_leap_year($g – 2008 + 1386);
}

my $prev;
for (1979 .. 2028) {
my $is = is_g_leap_year($_);
printf “%4d %s\n”, $_, $is ? “*” : ” “;
die if $is && $prev;
$prev = $is;
#  $ct++ if $is;
}
#print “>> $ct\n”;

همچنین بنگرید به:

نرم‌افزار تبدیل تقویم‌ها به یکدیگر

web analytics