我正在开发一个Java应用程序,我有一个timeStamp
(在long
中(。我可以很容易地使用此代码将其更改为公历日期:
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);
但我需要在Jalali日历上注明日期。我搜索了一下,但没有找到任何好的图书馆。你知道一个可靠且好的库来转换(或从timeStamp
创建Jalali格式的日期(吗?我不需要实现或算法,因为这个问题太bug,而且有很多规则,我需要一个可靠的解决方案
为了更好的本地化和语言支持,通常可以方便地使用IBM的ICU(International Components For Unicode(库。
这些API类似于标准的Java API,但增加了对本地化和国际化的额外支持(例如,时间和日历问题、排序、格式化规则以及具有适当Unicode支持的正则表达式实现(。
要创建一个波斯日历并用波斯语输出格式化的日期,你可以这样做:
import com.ibm.icu.text.DateFormat;
import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.ULocale;
...
ULocale locale = new ULocale("fa_IR@calendar=persian");
Calendar calendar = Calendar.getInstance(locale);
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, locale);
System.out.println(df.format(calendar));
这将输出:
چهاردنبى۱.Ş。
看看这个:https://github.com/amirmehdizadeh/JalaliCalendar
代码看起来不错,基于maven的项目,有很多单元测试。
github上有一个很好的库,它有一个非常简单的API,它有很多功能,它也可以在mavenCentral:上使用
https://github.com/razeghi71/JalaliCalendar
我在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<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
当然,日历提供了更多的功能,如日期算术(添加天或月,以天、月等为单位计算增量(或字段/元素操作(易于进入月的最后一天等(。
关于迄今为止在这里提出的其他库的补充说明:
amirmehdizadeh/JalaliCalendar库以及ICU4J库都使用基于零的月份。这可能非常令人困惑。使用amirmehdizadeh库的非直观示例:
YearMonthDate jalali = new YearMonthDate(1394, 10, 5); // 11th month (Bahman)
YearMonthDate gregorian = JalaliCalendar.jalaliToGregorian(jalali);
System.out.println(gregorian); // 2016/0/25 => 1st month (January)
关于国际化,我不认为ICU4J在波斯历领域提供超过Time4J的功能,因为后者也是基于最新的CLDR版本v28。Time4J实际上支持大约25种波斯月份和时代的语言(包括波斯语和普什图语(。
您可以在Java中使用JalCal,Jalali(波斯(日历转换器:
<dependency>
<groupId>com.github.sbahmani</groupId>
<artifactId>jalcal</artifactId>
<version>1.0</version>
</dependency>
1.贾拉利至格里高利
Calendar expected4 = Calendar.getInstance(TimeZone.getDefault());
expected4.set(2014, 7, 5, 1, 23, 1);
assertThat(JalCal.jalaliToGregorian(1393, 5, 14, 1, 23, 1).toString()).isEqualTo(expected4.getTime().toString());
2.格里高利至贾拉利
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 5);
cal.set(Calendar.MONTH, 6);
cal.set(Calendar.YEAR, 2014);
cal.set(Calendar.HOUR_OF_DAY, 10);
cal.set(Calendar.MINUTE, 25);
cal.set(Calendar.SECOND, 1);
cal.set(Calendar.MILLISECOND, 0);
assertThat(JalCal.gregorianToJalali(cal.getTime(), true)).isEqualTo("14/04/1393 10:25:01");
assertThat(JalCal.gregorianToJalali(new Date(1426883400000l), true)).isEqualTo("01/01/1394 00:00:00");