تبدیل تاریخ در جاوا

 

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

 

در این پست می خوام اموزش تبدیل انواع تاریخ (شمسی به میلادی، شمسی به قمری، میلادی به شمسی، میلادی به قمری، قمری به شمسی و قمری به میلادی) رو آموزش بدم.

 

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

 

اگه در گوگل سرچ کنید، کد های زیادی برای تبدیل تاریخ در جاوا پیدا میکنید، ولی اکثرا ایراد دارن و در یک محدوده ی زمانی مشخصی خروجی درست میدن و برای بقیه زمان ها خروجی غلط میده.

 

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

 

 

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

 

دوستان یک نکته رو همینجا بگم، اصولا مبحث تبدیل تاریخ کار راحتی نیست، مفاهیم بسیار زیادی داره، از جمله سال کبیسه، مبحث timezone و موارد دیگه که مجالش نیست براتون بگم. خب بریم سراغ اصل کار و من براتون چندتا کد مینویسم و تبدیل تاریخ انجام میدیم.

 

دانلود فایل لایبرری icu4j و اضافه کردن ان به اکلیپس:

فایل icu4j.jar رو میتونید از اینجا دانلود کنید و به پروژتون در اکلیپس اضافه کنید (اسکرین شات های زیر رو تماشا کنید).

 

دوستان زمانی که من دارم این پست رو مینویسم اخرین ورژن این لایبرری 65.1 هست. ورژن های جدید تر ممکنه در آینده بیاد. برای دانلود آخرین ورژن لایبرری روی عدد 65.1 کلیک کنید (مطابق عکس زیر)

 

 

 

 

 

 

و سپس عکس زیر

 

 

 

 

 

و اما بریم سراغ مثال ها و چندتا نمونه کد براتون بنویسم. اولین مثال رو به هر دو روش مینویسم. اما مثال های بعدی رو فقط با روش دوم.

 

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

 

package finalCal;
import java.time.ZoneId;
import com.ibm.icu.util.TimeZone;
import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.GregorianCalendar;
import com.ibm.icu.util.ULocale;

public class From_Gregorian_to_Persian {

    public  From_Gregorian_to_Persian () {

        ULocale PERSIAN_LOCALE = new ULocale("fa_IR@calendar=persian");
        ZoneId IRAN_ZONE_ID = ZoneId.of("Asia/Tehran");

        Calendar gregoriancal = new GregorianCalendar();

        gregoriancal.set(2025, Calendar.AUGUST, 1);

        System.out.println("Gregorian Calendar:\t" + (gregoriancal.get(Calendar.YEAR)) + "/" + ( gregoriancal.get(Calendar.MONTH ) +1) + "/" + gregoriancal.get(Calendar.DATE));

        Calendar persiancal = Calendar.getInstance(PERSIAN_LOCALE);
        persiancal.clear();
        persiancal.setTimeZone(TimeZone.getTimeZone("Asia/Tehran"));

        persiancal.setTime(gregoriancal.getTime());

        // Display the date.
        System.out.println("Persian Calendar:\t" + (persiancal.get(Calendar.YEAR) ) + "/" + ( persiancal.get (Calendar.MONTH) + 1 ) + "/" + persiancal.get(Calendar.DATE));

    }

}

 

Output:
Gregorian Calendar:    2025/8/1
Persian Calendar:    1404/5/10

 

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

 

package finalCal;

import java.time.ZoneId;

import com.ibm.icu.text.DateFormat;
import com.ibm.icu.text.SimpleDateFormat;
import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.TimeZone;
import com.ibm.icu.util.ULocale;

public class From_Gregorian_to_Islamic {

      public From_Gregorian_to_Islamic () {

           
            ULocale PERSIAN_LOCALE = new ULocale("fa_IR@calendar=persian");
            ZoneId IRAN_ZONE_ID = ZoneId.of("Asia/Tehran");

            Calendar gregorianCalendar = Calendar.getInstance(gregorian_LOCALE);
            gregorianCalendar.setLenient(false);
            gregorianCalendar.clear();
            gregorianCalendar.setTimeZone(TimeZone.getTimeZone("Asia/Tehran"));
            // 29 september 2019
            gregorianCalendar.set(2019, 8, 29);

            // full date
            DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, PERSIAN_LOCALE);
            System.out.println(df.format(gregorianCalendar.getTime()));

            // date in "yyyy MMM dd" format
            SimpleDateFormat df1 = new SimpleDateFormat ("yyyy MMM dd", PERSIAN_LOCALE );
            System.out.println(df1.format(gregorianCalendar.getTime()));

            // name of month
            SimpleDateFormat df2 = new SimpleDateFormat (SimpleDateFormat.MONTH, PERSIAN_LOCALE );
            System.out.println(df2.format(gregorianCalendar.getTime()));

            // name of weekday
            SimpleDateFormat df3 = new SimpleDateFormat (SimpleDateFormat.WEEKDAY, PERSIAN_LOCALE );
            System.out.println(df3.format(gregorianCalendar.getTime()));

      }
}

 

 

 

 

 

 


مشخصات

آخرین ارسال ها

آخرین جستجو ها