تاریخ و تقویم هجری شمسی (جلالی) در جاوا

در مطلب قبلی که درباره تقویم و تاریخ در جاوا نوشتم، وعده داده بودم که به زودی نحوه کار کردن با تقویم هجری شمسی که به صورت رسمی تقویم جلالی نامیده می شود، مطلب مستقلی بنویسم. الوعده وفا!

تقویم (گاه شمار) جلالی

در ویکیپدیا فارسی درباره این تقویم آمده است:

گاه‌شماری هجری خورشیدی یا تقویم هجری شمسی برپایهٔ گاه‌شماری جلالی با مبدأ هجری است. گاه‌شماری هجری شمسی، اکنون در کشورهای ایران و افغانستان گاه‌شمار رسمی است. این گاه‌شماری در ایران با تصویب مجلس شورای ملی در ۱۱ فروردین ۱۳۰۴، گاه‌شمار رسمی کشور اعلام شد.

مبدأ گاه‌شماری هجری خورشیدی مانند گاه‌شماری هجری قمری، سال هجرت پیامبر اسلام، محمد، سال ۶۲۲ میلادی از مکه به مدینه می‌باشد. آغاز هجرت پیامبر اسلام از مکه روز دوشنبه (۱ ربیع‌الاول/ ۲۴ شهریور سال ۱ هجری) برابر با ۱۳ سپتامبر ۶۲۲ میلادی قدیم (ژولینی) و ۱۶ سپتامبر ۶۲۲ میلادی جدید (گرگوری) و ورود پیامبر به مدینه روز ۸ ربیع‌الاول همان سال می‌باشد.

این گاه‌شماری از ۳۶۵ روز در قالب ۱۲ ماه تشکیل شده است و براساس گاه‌شماری جلالی (دقیق‌ترین تقویم جهان) سرآغاز آن اعتدال بهاری در نیمکرهٔ شمالی است. با این تفاوت که مبدأ آن هجری است. طراحان گاه‌شماری جلالی، گروهی ریاضیدان و اخترشناس بودند که نامدارترین آنها حکیم خیام ریاضیدان و شاعر ایرانی بود. اینان به سفارش ملکشاه سلجوقی و با اصلاح گاه‌شماری یزدگردی به این گاه‌شمار نوین دست یافتند. گاه‌شماری جلالی با حفظ سرآغاز و طول سال با تغییر مبدأ، اسامی و طول ماه‌ها در قالب گاه‌شماری هجری شمسی برجی درآمده و باز با تغییراتی در طول ماه‌ها ضمن تنوع اسامی آنها، عنوان تقویم هجری شمسی پیدا کرد.

این تقویم بر پایه سال اعتدالی خورشیدی برابر با ۳۶۵٫۲۴۲۱۹۸۷۸ روز است. که سال تقویمی آن ۳۶۵ و ۳۶۶روزه (کبیسه) می‌باشد.

هر سال دارای ۴ فصل با نام‌های بهار، تابستان، پاییز، و زمستان است و هر فصل ۳ ماه دارد و هر ماه تقریباً ۴ هفته و هرهفته ۷ روز با نام‌های شنبه، یکشنبه، دوشنبه، سه‌شنبه، چهارشنبه، پنجشنبه و جمعه (آدینه) دارد. هر سال با ۱ فروردین و فصل بهار آغاز می‌شود.

بلندترین روز سال در ۱ تیر و بلندترین شب سال در شب یلدا (از غروب ۳۰ آذر تا طلوع آفتاب در ۱ دی) رخ می‌دهد. طول ماه‌های این گاه‌شماری در طول تاریخ و در کشورهای مختلف متفاوت بوده است، ولی از حدود سال ۱۳۴۸ در ایران و افغانستان طول ماه‌ها یکسان است.[۲] طول ماهها در نیمه اول سال ۳۱ روزه و در نیمه دوم سال ۳۰ روزه است با این تفاوت که ماه پایانی (اسفند) ۲۹ روزه است و تنها در سالهای کبیسه ۳۰ روز خواهد داشت.

گاه‌شماری هجری خورشیدی، بر اساس مبانی گاه‌شماری جلالی (ایجاد شده در ۴۷۱ قمری) و پس از تغییراتی در گاه‌شماری جلالی در قالب گاه‌شماری هجری خورشیدی برجی در سال ۱۲۸۹ خورشیدی برای امور مالی کشور رسمیت یافت. با تغییراتی در عناوین ماه‌ها و تعدیل آنها در تاریخ ۱۱ فروردین ۱۳۰۴ هجری خورشیدی تقویم رسمی ایران اعلام شد.[۱۳]

در آخرین روزهای سال ۱۳۰۳ و اولین روزهای سال ۱۳۰۴ ش، نمایندگان پنجمین دوره مجلس شورای ملی گاه‌شماری هجری شمسی کنونی ایران را تصویب کردند. بر اساس این قانون استفاده از گاه‌شماری خَتا و اویغور (گاه‌شماری دوازده حیوانی) منسوخ شد (در حالی که استفاده از گاه‌شماری دوازده حیوانی همچنان در فرهنگ عمومی مردم ایران رواج دارد.) و گاه‌شماری هجری شمسی با مبدأ هجرت پیامبر اسلام از مکه به مدینه و با طول سال شمسی و با نام ماه‌های فارسی میانه مورد استفاده قرار گرفت. مبدأ این گاه‌شماری، اول فروردین سال اول هجرت پیامبر است؛ یعنی، ۱۱۹ روز پیش از مبدأ گاه‌شماری هجری قمری و ۱۷۹ روز پیش از هجرت. در عمل بین کبیسه‌های اعمال شده در این گاه‌شماری با گاه‌شماری جلالی اختلافهایی وجود دارد. آنزمان برای رفع چنین اختلافاتی در گاه‌شماری هجری شمسی، هیئت اصلاح تقویم تشکیل شده. این هیات همان روش کلی کبیسه‌گیری گاه‌شماری میلادی گرگوری را پیشنهاد کرد و علاوه بر آن آرایه جدیدی برای تعدیل کبیسه‌گیری عرضه نمود. امروزه روش سهل ممتنعی برای استخراج دوره‌های‌کبیسه در گاه‌شماری هجری شمسی ابداع شده است. طول ماه‌های آن در نیمه نخست سال ۳۱روزه و درنیمه دوم سال ۳۰روزه است که در سالهای غیرکبیسه ماه آخر ۲۹روزه است. سال‌های عادی آن ۳۶۵روزه و هر چهار یا پنج سال یکبار کبیسه‌گیری ۳۶۶روزه می‌شود…

تقویم فارسی و جاوا

متاسفانه، جاوا به صورت پیش فرض تقویم ایرانی مبتنی بر گاهشمار جلالی که در ایران و افغانستان مورد استفاده است را پشتیبانی نمی کند و همین باعث شده است که برنامه نویسان زیادی برای رفع این مشکل کاری بکنند. بسیاری پروژه های کدباز برای این موضوع نوشته شده که هر کدام مزایا و معایب خود را دارند. من از حدود ۱۰ سال قبل و در پروژه های زیادی از یک کتابخانه کدباز استفاده کرده ام و امروز می خواهم آن را به شما هم معرفی کنم: Persian Calendar که نویسنده آن آقای قاسم کیانی است و در سایت sf.net در سال ۲۰۰۳ منتشر شده است:

persian-calendar-by-ghasem-kiani

این کتابخانه را دانلود کنید. بعد از دانلود، فایل فشرده آن را در یک پوشه باز کنید. ساختار فایل های آن شبیه شکل زیر است:

persian-calendar-by-ghasem-kiani-files

به پوشه lib بروید و فایل persiancalendar.jar و icu4j_3_2_calendar.jar را به پروژه خود بیافزایید.

۱- اگر در اکلیپس هستید و بر روی پروژه جاوا کار می کنید، می توانید در پنجره Package Explorer بر روی نام پروژه راست کلیک کنید و بعد Project Properties را بزنید و مراحل بعدی را مطابق عکس زیر دنبال کنید:

persian-calendar-by-ghasem-kiani-add-lib-to-java-project

۲- اگر در اکلیپس هستید و بر روی پروژه اندروید کار می کنید، خیلی ساده فایل persiancalendar.jar و icu4j_3_2_calendar.jar را در شاخه libs پروژه خود کپی کنید!

مثالهایی از استفاده از کتابخانه PersianCalendar

1- ساخت یک نمونه از شی PersianCalendar با تاریخ و ساعت فعلی سیستم:

// Ex. 1
        // Create a PersianCalendar object with current date and time of system
        System.out.println("Create a PersianCalendar object with current date and time of system:");
        PersianCalendar persianCalendar1 = new PersianCalendar(new Date());

        System.out.println("Year:" + persianCalendar1.get(Calendar.YEAR));
        System.out.println("Month:" + (persianCalendar1.get(Calendar.MONTH) + 1)); // 0-11
        System.out.println("Day:" + persianCalendar1.get(Calendar.DAY_OF_MONTH));
        System.out.println("Hour:" + persianCalendar1.get(Calendar.HOUR_OF_DAY)); // HOUR_OF_DAY:
                                                                     // 0-23,
                                                                     // HOUR:0-11
        System.out.println("Minute:" + persianCalendar1.get(Calendar.MINUTE));
        System.out.println("Second:" + persianCalendar1.get(Calendar.SECOND));

2- تبدیل تاریخ شمسی به میلادی

        // Ex. 2
        // Convert Persian to Gregorian Calendar
        System.out.println("\nConvert Persian to Gregorian Calendar:");
        GregorianCalendar gregorianCalendar = new GregorianCalendar();
        gregorianCalendar.setTime(persianCalendar1.getTime());

        System.out.println("Year:" + gregorianCalendar.get(Calendar.YEAR));
        System.out.println("Month:" + (gregorianCalendar.get(Calendar.MONTH) + 1));
        System.out.println("Day:" + gregorianCalendar.get(Calendar.DAY_OF_MONTH));
        System.out.println("Hour:" + gregorianCalendar.get(Calendar.HOUR_OF_DAY));
        System.out.println("Minute:" + gregorianCalendar.get(Calendar.MINUTE));
        System.out.println("Second:" + gregorianCalendar.get(Calendar.SECOND));

3- تبدیل تاریخ میلادی به شمسی:

        // Ex. 3
        // Convert Gregorian Calendar to Persian (Jalali) Calendar
        System.out.println("\nConvert Gregorian Calendar to Persian (Jalali) Calendar:");
        PersianCalendar persianCalendar3 = new PersianCalendar();
        persianCalendar3.setTime(gregorianCalendar.getTime());

        System.out.println("Year:" + persianCalendar3.get(Calendar.YEAR));
        System.out.println("Month:" + (persianCalendar3.get(Calendar.MONTH) + 1));
        System.out.println("Day:" + persianCalendar3.get(Calendar.DAY_OF_MONTH));
        System.out.println("Hour:" + persianCalendar3.get(Calendar.HOUR_OF_DAY));
        System.out.println("Minute:" + persianCalendar3.get(Calendar.MINUTE));
        System.out.println("Second:" + persianCalendar3.get(Calendar.SECOND));

امیدوارم که این مطلب برایتان مفید باشد! برای مشاهده و دانلود کدهای این برنامه به GitHub مراجعه کنید:

download-github

facebooktwittergoogle_plusredditpinterestlinkedinmailfacebooktwittergoogle_plusredditpinterestlinkedinmail

28 فکر می‌کنند “تاریخ و تقویم هجری شمسی (جلالی) در جاوا

  1. سالار

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

    پاسخ
    1. علی بهزادیان نژاد نویسنده

      سلام
      من یک DatePicker نوشتم که از همین PersianCalendar استفاده می کنه. یک کمی تغییرش دادم و الان در وضعیت پایدار نیست. به زودی در یک مطلب جدید درباره ش می نویسم و در GitHub منتشرش می کنم.

      پاسخ
  2. ebrahimi

    سلام خسته نباشین هرچی سعی کردم دانلودش کنم نشد اگه ممکنه واسم روی ایمیلم بفرستین یا یه لینک دیگه بزارین ممنون میشم

    پاسخ
  3. mahdi

    سلام میخواستم بدونم چطوری میتونم ببینم یه تاریخ شمسی که وارد شده معتبر هست یا نه ؟
    مثلا اگه طرف وارد کرد ۱۳۶۵/۱۴/۲۹ بگه که اشتباهه ، یا حتی اگه مثلا وارد کرده ۱۳۶۵/۱۲/۳۰ اگه اون سال کبیسه نبوده بگه که خطایه
    ممنون

    پاسخ
    1. علی بهزادیان نژاد نویسنده

      این کامپوننت خودش همه چیز رو چک می کنه و نگرانی بابت انتخاب تاریخ اشتباه نباید داشته باشید. مثلا فقط اگر سال کبیسه باشه اسفند رو ۳۰ روز نمایش می ده و اگر کاربر در سال کبیسه تاریخ ۳۰ اسفند رو انتخاب کنه بعد سال رو تغییر بده، کامپوننت به صورت خودکار تاریخ انتخابی رو می کنه ۲۹ اسفند

      پ.ن: پوزش می‌خوام. فکر کردم این کامنت زیر پست مربوط به persian-date-picker نوشته شده بنابراین جوابی که دادم مربوط به اون کتابخونه است.

      پاسخ
  4. مهدی

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

    پاسخ
  5. علی

    سلام :
    ممنون بابت این لایبرری . فقط من الان می خوام استفاده کنم ازش ولی تا آخر اسفند ۱۳۹۴ داره. برای سال های بعد چی؟

    پاسخ
  6. حسین

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

    پاسخ
  7. ذوالفقار

    سلام.
    ممنون بابت زحمتی که کشیدین.
    فقط اینکه من تازه کارم و میخوام این کتابخانه به اندروید استودیو اضافه کنم ولی نمیشه.
    میشه لطف کنید و بگید چطور انجام میشه؟

    پاسخ
    1. علی بهزادیان نژاد نویسنده

      در سیستم تقویم جاوا شمارش ماه‌ها از صفر شروع میشه. بنابراین اولین ماه ماه صفر و آخرین ماه ماه یازده است.

      پاسخ
  8. کمال

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

    PersianDateFormat PDF = new PersianDateFormat(“yyyy/MM/dd”);

    لطفا راهنمایی بفرمایید
    متچکر

    پاسخ
  9. رسول

    سلام خسته نباشید
    من خیلی وقته دنبال همچین چیزی می گشتم دمتون گرم انصافا .
    فقط نمیدونم چطور دانلودش کنم لطفا کمک کنید ؟

    پاسخ

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>