我在自己的图书馆Time4J中用Java开发了自己的波斯(jalali)日历。 该实现部署了Borkowski算法(至少在公历2129年有效-没有2025错误)。
解决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 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 f2 =
ChronoFormatter.ofPattern(
"d. MMMM yyyy", PatternType.CLDR, Locale.ENGLISH, PersianCalendar.axis());
System.out.println(f2.format(jalali)); // 5. Bahman 1394
当然,日历提供了更多功能,例如日期算术(添加天或月,计算天,月等中的增量等)或字段/元素操作(轻松进入月份的最后一天等)。
到目前为止,这里建议的其他库的旁注:
库amirmehdizadeh / JalaliCalendar和ICU4J都使用从零开始的月份。 这可能非常令人困惑。 使用amirmehdizadeh的库的非直观示例:
YearMonthDate jalali = new YearMonthDate(1394, 10, 5); // really month 11 (Bahman)
YearMonthDate gregorian = JalaliCalendar.jalaliToGregorian(jalali);
System.out.println(gregorian); // 2016/0/25 => really month 1 (January)
关于国际化,我认为ICU4J在波斯日历方面不比Time4J提供更多,因为后者也基于最新的CLDR版本v28。 实际上,Time4J在波斯语的时代和时代支持大约25种语言(包括波斯语和普什图语)。