I developed my own Persian (jalali) calendar in Java in my Time4J library. The implementation deploys the Borkovsky algorithm (valid until at least the 21st year - 2129 is not a 2025 error).
The solution to a specific problem of OP:
// conversion from jalali to gregorian by constructed input PersianCalendar jalali = PersianCalendar.of(1394, 11, 5); // or use a safe enum instead of the month number: // PersianCalendar jalali = PersianCalendar.of(1394, PersianMonth.BAHMAN, 5); PlainDate gregorian = jalali.transform(PlainDate.class); System.out.println(gregorian); // 2016-01-25 // conversion to millis-since-unix (timezone-dependent) Moment moment1 = gregorian.atStartOfDay().inTimezone(ASIA.TEHRAN); long millisSinceUnix = TemporalType.MILLIS_SINCE_UNIX.from(moment1); System.out.println(millisSinceUnix); // 1453667400000L // conversion of millis-since-unix to jalali (timezone-dependent) Moment moment2 = TemporalType.MILLIS_SINCE_UNIX.translate(millisSinceUnix); PlainDate gregorian2 = moment2.toZonalTimestamp(ASIA.TEHRAN).toDate(); System.out.println(gregorian2.transform(PersianCalendar.class)); // AP-1394-11-05 // formatting and parsing in Farsi language using full style ChronoFormatter<PersianCalendar> f1 = ChronoFormatter.ofStyle(DisplayMode.FULL, new Locale("fa"), PersianCalendar.axis()); System.out.println(f1.format(jalali)); // ه.ش. ۱۳۹۴ بهمن ۵, دوشنبه System.out.println(f1.parse("ه.ش. ۱۳۹۴ بهمن ۵, دوشنبه")); // AP-1394-11-05 // formatting in English language using custom pattern ChronoFormatter<PersianCalendar> f2 = ChronoFormatter.ofPattern( "d. MMMM yyyy", PatternType.CLDR, Locale.ENGLISH, PersianCalendar.axis()); System.out.println(f2.format(jalali)); // 5. Bahman 1394
Of course, the calendar offers more options, such as arithmetic of dates (adding days or months, calculating delta in days, months, etc.) or manipulating a field / element (simple transition to the last day of the month, etc.).
Side notes about other libraries offered so far here:
The amirmehdizadeh / JalaliCalendar and ICU4J libraries use zero months . This can be very confusing. A non-intuitive example using the amirmehdizadeh library:
YearMonthDate jalali = new YearMonthDate(1394, 10, 5);
As for internationalization , I don’t think that ICU4J offers more than Time4J in the field of the Persian calendar, since the latter is based on the latest version of the CLDR version of v28. Time4J actually supports about 25 languages for the Persian months and eras (including Farsi and Pashto).
Meno Hochschild Feb 09 '16 at 13:55 2016-02-09 13:55
source share