در مطلب قبلی که درباره تقویم و تاریخ در جاوا نوشتم، وعده داده بودم که به زودی نحوه کار کردن با تقویم هجری شمسی که به صورت رسمی تقویم جلالی نامیده می شود، مطلب مستقلی بنویسم. الوعده وفا!
تقویم (گاه شمار) جلالی
در ویکیپدیا فارسی درباره این تقویم آمده است:
گاهشماری هجری خورشیدی یا تقویم هجری شمسی برپایهٔ گاهشماری جلالی با مبدأ هجری است. گاهشماری هجری شمسی، اکنون در کشورهای ایران و افغانستان گاهشمار رسمی است. این گاهشماری در ایران با تصویب مجلس شورای ملی در ۱۱ فروردین ۱۳۰۴، گاهشمار رسمی کشور اعلام شد.
مبدأ گاهشماری هجری خورشیدی مانند گاهشماری هجری قمری، سال هجرت پیامبر اسلام، محمد، سال ۶۲۲ میلادی از مکه به مدینه میباشد. آغاز هجرت پیامبر اسلام از مکه روز دوشنبه (۱ ربیعالاول/ ۲۴ شهریور سال ۱ هجری) برابر با ۱۳ سپتامبر ۶۲۲ میلادی قدیم (ژولینی) و ۱۶ سپتامبر ۶۲۲ میلادی جدید (گرگوری) و ورود پیامبر به مدینه روز ۸ ربیعالاول همان سال میباشد.
این گاهشماری از ۳۶۵ روز در قالب ۱۲ ماه تشکیل شده است و براساس گاهشماری جلالی (دقیقترین تقویم جهان) سرآغاز آن اعتدال بهاری در نیمکرهٔ شمالی است. با این تفاوت که مبدأ آن هجری است. طراحان گاهشماری جلالی، گروهی ریاضیدان و اخترشناس بودند که نامدارترین آنها حکیم خیام ریاضیدان و شاعر ایرانی بود. اینان به سفارش ملکشاه سلجوقی و با اصلاح گاهشماری یزدگردی به این گاهشمار نوین دست یافتند. گاهشماری جلالی با حفظ سرآغاز و طول سال با تغییر مبدأ، اسامی و طول ماهها در قالب گاهشماری هجری شمسی برجی درآمده و باز با تغییراتی در طول ماهها ضمن تنوع اسامی آنها، عنوان تقویم هجری شمسی پیدا کرد.
این تقویم بر پایه سال اعتدالی خورشیدی برابر با ۳۶۵٫۲۴۲۱۹۸۷۸ روز است. که سال تقویمی آن ۳۶۵ و ۳۶۶روزه (کبیسه) میباشد.
هر سال دارای ۴ فصل با نامهای بهار، تابستان، پاییز، و زمستان است و هر فصل ۳ ماه دارد و هر ماه تقریباً ۴ هفته و هرهفته ۷ روز با نامهای شنبه، یکشنبه، دوشنبه، سهشنبه، چهارشنبه، پنجشنبه و جمعه (آدینه) دارد. هر سال با ۱ فروردین و فصل بهار آغاز میشود.
بلندترین روز سال در ۱ تیر و بلندترین شب سال در شب یلدا (از غروب ۳۰ آذر تا طلوع آفتاب در ۱ دی) رخ میدهد. طول ماههای این گاهشماری در طول تاریخ و در کشورهای مختلف متفاوت بوده است، ولی از حدود سال ۱۳۴۸ در ایران و افغانستان طول ماهها یکسان است.[۲] طول ماهها در نیمه اول سال ۳۱ روزه و در نیمه دوم سال ۳۰ روزه است با این تفاوت که ماه پایانی (اسفند) ۲۹ روزه است و تنها در سالهای کبیسه ۳۰ روز خواهد داشت.
گاهشماری هجری خورشیدی، بر اساس مبانی گاهشماری جلالی (ایجاد شده در ۴۷۱ قمری) و پس از تغییراتی در گاهشماری جلالی در قالب گاهشماری هجری خورشیدی برجی در سال ۱۲۸۹ خورشیدی برای امور مالی کشور رسمیت یافت. با تغییراتی در عناوین ماهها و تعدیل آنها در تاریخ ۱۱ فروردین ۱۳۰۴ هجری خورشیدی تقویم رسمی ایران اعلام شد.[۱۳]
در آخرین روزهای سال ۱۳۰۳ و اولین روزهای سال ۱۳۰۴ ش، نمایندگان پنجمین دوره مجلس شورای ملی گاهشماری هجری شمسی کنونی ایران را تصویب کردند. بر اساس این قانون استفاده از گاهشماری خَتا و اویغور (گاهشماری دوازده حیوانی) منسوخ شد (در حالی که استفاده از گاهشماری دوازده حیوانی همچنان در فرهنگ عمومی مردم ایران رواج دارد.) و گاهشماری هجری شمسی با مبدأ هجرت پیامبر اسلام از مکه به مدینه و با طول سال شمسی و با نام ماههای فارسی میانه مورد استفاده قرار گرفت. مبدأ این گاهشماری، اول فروردین سال اول هجرت پیامبر است؛ یعنی، ۱۱۹ روز پیش از مبدأ گاهشماری هجری قمری و ۱۷۹ روز پیش از هجرت. در عمل بین کبیسههای اعمال شده در این گاهشماری با گاهشماری جلالی اختلافهایی وجود دارد. آنزمان برای رفع چنین اختلافاتی در گاهشماری هجری شمسی، هیئت اصلاح تقویم تشکیل شده. این هیات همان روش کلی کبیسهگیری گاهشماری میلادی گرگوری را پیشنهاد کرد و علاوه بر آن آرایه جدیدی برای تعدیل کبیسهگیری عرضه نمود. امروزه روش سهل ممتنعی برای استخراج دورههایکبیسه در گاهشماری هجری شمسی ابداع شده است. طول ماههای آن در نیمه نخست سال ۳۱روزه و درنیمه دوم سال ۳۰روزه است که در سالهای غیرکبیسه ماه آخر ۲۹روزه است. سالهای عادی آن ۳۶۵روزه و هر چهار یا پنج سال یکبار کبیسهگیری ۳۶۶روزه میشود…
تقویم فارسی و جاوا
متاسفانه، جاوا به صورت پیش فرض تقویم ایرانی مبتنی بر گاهشمار جلالی که در ایران و افغانستان مورد استفاده است را پشتیبانی نمی کند و همین باعث شده است که برنامه نویسان زیادی برای رفع این مشکل کاری بکنند. بسیاری پروژه های کدباز برای این موضوع نوشته شده که هر کدام مزایا و معایب خود را دارند. من از حدود ۱۰ سال قبل و در پروژه های زیادی از یک کتابخانه کدباز استفاده کرده ام و امروز می خواهم آن را به شما هم معرفی کنم: Persian Calendar که نویسنده آن آقای قاسم کیانی است و در سایت sf.net در سال ۲۰۰۳ منتشر شده است:
این کتابخانه را دانلود کنید. بعد از دانلود، فایل فشرده آن را در یک پوشه باز کنید. ساختار فایل های آن شبیه شکل زیر است:
به پوشه lib بروید و فایل persiancalendar.jar و icu4j_3_2_calendar.jar را به پروژه خود بیافزایید.
۱- اگر در اکلیپس هستید و بر روی پروژه جاوا کار می کنید، می توانید در پنجره Package Explorer بر روی نام پروژه راست کلیک کنید و بعد Project Properties را بزنید و مراحل بعدی را مطابق عکس زیر دنبال کنید:
۲- اگر در اکلیپس هستید و بر روی پروژه اندروید کار می کنید، خیلی ساده فایل persiancalendar.jar و icu4j_3_2_calendar.jar را در شاخه libs پروژه خود کپی کنید!
مثالهایی از استفاده از کتابخانه PersianCalendar
۱- ساخت یک نمونه از شی 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: // ۰-۲۳, // HOUR:0-11 System.out.println("Minute:" + persianCalendar1.get(Calendar.MINUTE)); System.out.println("Second:" + persianCalendar1.get(Calendar.SECOND));
۲- تبدیل تاریخ شمسی به میلادی
// 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));
۳- تبدیل تاریخ میلادی به شمسی:
// 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 مراجعه کنید:
tnx mr
ممنون استاد
اگرامکانش هست یک نمونه dateTimePicker فارسی خوب و قوی معرفی کنید که با عبور از روزها و ماه های مختلف، واکنش مناسب در فیلد ماه و سال رو داشته باشه.
سلام
من یک DatePicker نوشتم که از همین PersianCalendar استفاده می کنه. یک کمی تغییرش دادم و الان در وضعیت پایدار نیست. به زودی در یک مطلب جدید درباره ش می نویسم و در GitHub منتشرش می کنم.
سلام خیلی خوب بود ممنون
dateTimePicker فارسی شما آماده هست؟
ممنون
سلام
نسخه اولیه PersianDatePicker رو از اینجا بگیرید: https://github.com/alibehzadian/PersianDatePicker
سلام
نحوه استفاده از datapicker خودتون چجوری هست؟
من کدهاشو نگاه کردم ماله اندروید، خوده جاوا رو ندارین؟
سلام. این کامپوننت برای اندروید است.
چرا با یک ماه تغییر تاریخ شمسیو میده ؟
سلام و ممنون از مطلب مفید
ماه رو برای من هم یکی کم می زنه. مشکل از کجاست؟
با سلام
این کتابخانه شما خود ورودی را باز می گرداند و هیچ تبدیلی بر روی آن انجام نمی دهد
لطفا بررسی کنید با تشکر
با سلام
من نیاز به کد تاریخ ماه قمری در اندروید دارم
می تونسد کمکم کنید؟
با تشکر
سلام. کتابخانه ICU4J از تقویم اسلامی پشتیبانی میکند.
سلام خسته نباشین هرچی سعی کردم دانلودش کنم نشد اگه ممکنه واسم روی ایمیلم بفرستین یا یه لینک دیگه بزارین ممنون میشم
سلام میخواستم بدونم چطوری میتونم ببینم یه تاریخ شمسی که وارد شده معتبر هست یا نه ؟
مثلا اگه طرف وارد کرد ۱۳۶۵/۱۴/۲۹ بگه که اشتباهه ، یا حتی اگه مثلا وارد کرده ۱۳۶۵/۱۲/۳۰ اگه اون سال کبیسه نبوده بگه که خطایه
ممنون
این کامپوننت خودش همه چیز رو چک می کنه و نگرانی بابت انتخاب تاریخ اشتباه نباید داشته باشید. مثلا فقط اگر سال کبیسه باشه اسفند رو ۳۰ روز نمایش می ده و اگر کاربر در سال کبیسه تاریخ ۳۰ اسفند رو انتخاب کنه بعد سال رو تغییر بده، کامپوننت به صورت خودکار تاریخ انتخابی رو می کنه ۲۹ اسفند
پ.ن: پوزش میخوام. فکر کردم این کامنت زیر پست مربوط به persian-date-picker نوشته شده بنابراین جوابی که دادم مربوط به اون کتابخونه است.
حالتی وجود داره که فقط یه edittext باشه و بشه فقط توش تاریخ زد، منظورم اینه که من تویه فرمم فقط اون سر وسط رو میخوام و نمیخوام که تاریخ قبل و بعد رو بالا و پایین تاریخ جاری نشون بده، آیا این امکان وجود داره ، اگه داره چطوری میتونم انجامش بدم
با تشکر از سایت مفیدتون
سطر وسط *
سلام :
ممنون بابت این لایبرری . فقط من الان می خوام استفاده کنم ازش ولی تا آخر اسفند ۱۳۹۴ داره. برای سال های بعد چی؟
آخ . اشتباه از من بود که ندیدم . شرمنده!
سلام.
خوشحالم ازینکه هستن افرادی که به فکر هم نوع خودشونن.
مرسی بابت این کتابخانه ای که ساختین و برای استفاده در دسترس عموم گذاشتین.
سلام.
ممنون بابت زحمتی که کشیدین.
فقط اینکه من تازه کارم و میخوام این کتابخانه به اندروید استودیو اضافه کنم ولی نمیشه.
میشه لطف کنید و بگید چطور انجام میشه؟
سلام در لینک پایین Date picker تقویم شمسی برای استفاده در پروژه های java قرار داده شده است.
http://sunfile.sellfile.ir/prod-420701-%D8%AA%D9%82%D9%88%DB%8C%D9%85+%D9%81%D8%A7%D8%B1%D8%B3%DB%8C+%D8%B4%D9%85%D8%B3%DB%8C+DatePicker+%D8%A8%D8%B1%D8%A7%DB%8C+%D8%AC%D8%A7%D9%88%D8%A7+java.html
سلام
این تقویم ماه رو یکی کم میزنه مشکل از کجاست؟؟؟
در سیستم تقویم جاوا شمارش ماهها از صفر شروع میشه. بنابراین اولین ماه ماه صفر و آخرین ماه ماه یازده است.
با سلام
مرسی از معرفی این تقویم خیلی به کارم اومد.
ولی یه مشکلی هس هنگام اجرای کد زیر خطا میده
PersianDateFormat PDF = new PersianDateFormat(“yyyy/MM/dd”);
لطفا راهنمایی بفرمایید
متچکر
سلام خسته نباشید
من خیلی وقته دنبال همچین چیزی می گشتم دمتون گرم انصافا .
فقط نمیدونم چطور دانلودش کنم لطفا کمک کنید ؟
واسه استفاده تو برنامه جاوا نت بینز میخواست
فـوق العاده بود… عــــــــــــــــــالی
سلام
چطوری با استفاده ازین کتابخونه این تاریخ رو ۱۲-۱۲-۱۳۹۵ به میلادی تبدیل کنم ؟؟؟
از این library هم میشه استفاده کرد. Immutable هست و شبیه به API در Java 8 هست
https://github.com/mfathi91/persian-date-time