55

私は Java アプリを開発しており、timeStamp(in long) があります。このコードを使用して、グレゴリオ暦の日付に簡単に変更できます。

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);

しかし、ジャラリカレンダーに日付が必要です。検索しましたが、適切なライブラリが見つかりませんでした。変換 (または から Jalali 形式の日付を作成) するための信頼できる優れたライブラリを知っていますtimeStampか? 実装やアルゴリズムは必要ありません。この問題はバグが多く、多くのルールがあるため、信頼できる解決策が必要です

4

5 に答える 5

83

ローカリゼーションと言語サポートを向上させるために、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));

これは出力されます:

続きを読む もっと少なく読む

于 2014-04-30T10:48:16.697 に答える
25

これを見てください:https://github.com/amirmehdizadeh/JalaliCalendar

コードは素晴らしく、Maven ベースのプロジェクトであり、多くの単体テストが含まれています。

于 2014-04-30T10:21:31.577 に答える
8

ライブラリTime4J内で Java で独自のペルシャ (ジャラリ) カレンダーを開発しました。実装は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 の言語を実際にサポートしています。

于 2016-02-09T13:55:59.693 に答える
4

Java で Jalali(Persian) Calender Converter であるJalCalを使用できます。

<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");
于 2017-08-29T10:09:36.867 に答える