Fork me on GitHub

گاهشماری جلالی

بیشتر نرم افزار هایی که فارسی هستند، نیاز دارند تا زمان را به تاریخ ایران نشان دهند. برای این کار چندین ابزار و کتابخانه به زبان های گوناگون نوشته شده است. سال گذشته، زمانی که روی یک نرم افزار کار می کردم، خیلی به دنبال یک کتابخانه ی تاریخ گشتم ولی هیچ کدام نیاز هایم را براورده نکرد. بیشتر آن ها الگوریتم نادرستی داشتند. برخی تنها در یک بازه ی زمانی کوتاه که کمتر از ۱۰۰ سال بود کار می کردند. برخی مشکل پروانه (License) داشتند. سرانجام تصمیم گرفتم خودم دست به کار شوم و گاهشماری جلالی را ساختم.

الگوریتم

الگوریتم های فراوانی نوشته شده ولی بیشتر آن ها در یک دوره ی زمانی کوتاه کار می کنند. پس از کمی جستجو، الگوریتمی را پیدا کردم که در یک بازه ی زمانی ۳۰۰۰ ساله کار می کند! این الگوریتم را کازیمیرز برکوسکی نزدیک به ۲۰ سال پیش نوشته است و کارایی بسیار بالایی هم دارد. تنها مشکل این بود که الگوریتم به زبان Fortran نوشته شده بود.

این الگوریتم یک تابع به نام jalCal دارد که مشخص می کند که آیا یک سال جلالی، کبیسه است یا نه. همچنین چهار تابع کمکی دیگر دارد. j2d یک تاریخ جلالی را به روز ژولیوسی (Julian Day) تبدیل می کند. d2j وارون این کار را انجام می دهد. g2d یک تاریخ میلادی را به روز ژولیوسی تبدیل می کند. d2g هم وارون آن را انجام می دهد.

jalaali-js

با بازنویسی الگوریتم به زبان جاوااسکریپت، jalaali-js ساخته شد. این پروژه الگوریتم گفته شده را پیاده می کند و می توانید آن را در مرورگر ها یا برنامه های Node.js به کار برید. افزون بر تابع های گفته شده در الگوریتم، این کتابخانه چندین تابع کمکی دیگر هم دارد که کار را ساده تر می کنند.

toJalaali سال، ماه و روز میلادی را می گیرد و سال، ماه و روز جلالی را بر می گرداند. toGregorian هم وارون آن را انجام می دهد. isValidJalaaliDate هم درستی یک تاریخ جلالی را بررسی می کند.

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

moment-jalaali

یک کتابخانه ی بسیار کاربردی در زبان جاوااسکریپت، momentjs است. این کتابخانه، ابزار بسیار توانمندی است. برای آشنایی بیشتر با آن پایگاه اش را ببینید. moment-jalaali یک افزونه برای moment است و با آن می توانید همزمان با هر دو تاریخ میلادی و جلالی کار کنید. با این افزونه، این کتابخانه بسیار توانمند تر شده و می توانید کارهای گوناگونی انجام دهید.

با آن می توانید روز، ماه یا سال به یک تاریخ بیافزایید یا از آن بکاهید. برای نمونه اگر ۶ ماه جلالی به ۱۳۹۳/۶/۳۱ بیافزایید، به درستی به تاریخ ۱۳۹۳/۱۲/۲۹ می رسید. ولی اگر ۱۸۰ روز به آن بیافزایید به تاریخ ۱۳۹۴/۱/۱ می رسید.

این کتابخانه، تابع هایی مانند add و subtract برای افزودن و کاستن زمان دارد. همچنین تابع هایی مانند startOf و endOf دارد که آغاز یا پایان یک سال، ماه، روز، ساعت و ... را می دهند. برای دیدن دیگر تابع ها، moment و moment-jalaali را ببینید.

jalaali-hs

چندی پیش زبان Haskell را می آموختم و سپس این الگوریتم را با آن زبان نوشتم و jalaali-hs ساخته شد. این پروژه همانند jalaali-js است و همان تابع ها را دارد.

jalaali-swift

به تازگی نیز زبان Swift را آموختم و این الگوریتم را با آن نیز نوشتم و jalaali-swift ساخته شد. برای ساخت برنامه های iOS و OS X بسیار کمک خواهد کرد.

پروانه

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

بپیوندید

در GitHub یک سازمان به نام jalaali ساخته ام و همه ی این کتابخانه ها زیر آن هستند. نشانی آن هم github.com/jalaali است. می توانید به این پروژه بپیوندید و با نوشتن این الگوریتم از روی یکی از همین ابزارها به زبان های دیگر، مشکل گاهشماری جلالی را از میان ببریم.

برای نمونه، اگر بخواهیم یک گزارش از پایگاه داده ی MySQL بگیریم که با سال و ماه جلالی گروه بندی شده باشد، کار بسیار دشواری خواهد بود. اگر این الگوریتم را با زبان SQL بنویسیم می توانیم این کار را به سادگی در خود پایگاه داده ی MySQL انجام دهیم.