Java中Jalali Calendar的日期转换器?

Sae*_*eed 50 java calendar localization date jalali-calendar

我正在开发一个Java App,我有一个timeStamp(in long).我可以轻松地使用此代码将其更改为公历日期:

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);
Run Code Online (Sandbox Code Playgroud)

但我需要在Jalali日历中有日期.我搜索但没有找到任何好的图书馆.你知道一个可靠而好的库来转换(或用Jalali格式创建日期timeStamp)吗?我不需要实现或算法,因为这个问题太麻烦并且有很多规则,我需要一个可靠的解决方案

jar*_*bjo 75

为了更好地进行本地化和语言支持,使用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));
Run Code Online (Sandbox Code Playgroud)

这将输出:

چهارشنبه10اردیبهشت1393ه.ش.

  • 6 MB库大小????? 太多了. (4认同)
  • @mohamadaligharat 考虑到可能有数百万 ICU 图书馆用户*没有*在增加一年这样的微不足道的任务上有任何问题,我仍然坚信问题出在*你的*代码中。除非您确切地透露您在做什么,ICU 库返回什么以及您期望它返回什么,否则您声称该库不可靠对任何人都没有帮助。 (2认同)

Ale*_*exR 21

看看这个:https://github.com/amirmehdizadeh/JalaliCalendar

代码看起来不错,基于maven的项目,很多单元测试.


Moh*_*ghi 10

github上有一个很好的库,它有一个非常简单的API,它有很多功能,它也可以在mavenCentral上使用:

https://github.com/razeghi71/JalaliCalendar


Men*_*ild 7

我在我的图书馆Time4J中用 Java开发了自己的波斯语(jalali)日历.该实现部署了Borkowski的算法(至少在格里高利2129年之前有效 - 没有2025个bug).

解决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
Run Code Online (Sandbox Code Playgroud)

当然,日历提供了更多功能,如日期算术(添加天或月,计算天数,月数等)或字段/元素操作(容易进入一个月的最后一天等).

到目前为止,这里提出的其他图书馆的附注:

图书馆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)
Run Code Online (Sandbox Code Playgroud)

关于国际化,我不认为ICU4J在波斯日历领域提供的不仅仅是Time4J,因为后者也是基于最新的CLDR版本v28.Time4J实际上支持波斯月和时代的大约25种语言(包括波斯语和普什图语).