Je développe une Java et j'ai une timeStamp
(dans long
). Je peux facilement utiliser ce code pour le changer en une date grégorienne:
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);
Mais je dois avoir la date dans le calendrier Jalali. J'ai cherché mais je n'ai pas trouvé de bonne bibliothèque. Connaissez-vous une bibliothèque fiable et bonne pour la conversion (ou la création de dates au format Jalali à partir de timeStamp
)? Je n'ai pas besoin d'une implémentation ou d'un algorithme, car ce problème est trop bogué et a beaucoup de règles, j'ai besoin d'une solution fiable
Jetez un oeil à ce sujet: https://github.com/amirmehdizadeh/JalaliCalendar
Le code ressemble à Nice, projet basé sur Maven, beaucoup de tests unitaires.
Pour une meilleure localisation et prise en charge des langues, il est souvent pratique d'utiliser la bibliothèque ICU (International Components for Unicode) d'IBM.
Les API sont similaires à la norme Java API, mais ajoutent une prise en charge supplémentaire pour la localisation et l'internationalisation (par exemple, les problèmes d'heure et de calendrier, le tri, les règles de formatage et une implémentation regex avec une prise en charge Unicode appropriée).
Pour créer un calendrier persan et afficher la date formatée en persan, vous feriez par exemple faites quelque chose comme ça:
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));
Cela produira:
چهارشنبه ۱۰ اردیبهشت ۱۳۹۳ ه.ش.
Il y a une bonne bibliothèque sur github qui a une API très simple et il a beaucoup de capacités et il est également disponible sur mavenCentral:
J'ai développé mon propre calendrier persan (jalali) en Java dans ma bibliothèque Time4J . L'implémentation déploie l'algorithme de Borkowski (valide chez au moins jusqu'à l'année grégorienne 2129 - pas de bug 2025).
Solution au problème concret de l'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
Bien sûr, le calendrier offre plus de fonctionnalités comme l'arithmétique des dates (ajout de jours ou de mois, calcul du delta en jours, mois, etc.) ou les manipulations de champs/éléments (passage facile au dernier jour du mois, etc.).
Notes annexes sur les autres bibliothèques proposées jusqu'ici:
Les bibliothèques amirmehdizadeh /JalaliCalendar ainsi que ICU4J utilisent toutes les deux mois de base zéro . Cela peut être extrêmement déroutant. Exemple non intuitif utilisant la bibliothèque d'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)
À propos de l'internationalisation , je ne pense pas que ICU4J offre plus que Time4J dans le domaine du calendrier persan car celui-ci est basé sur la dernière version CLDR v28, aussi. Time4J prend en charge environ 25 langues pour les mois et les époques perses (y compris le persan et le pachto).
Vous pouvez utiliser JalCal ce convertisseur de calendrier Jalali (persan) en Java:
<dependency>
<groupId>com.github.sbahmani</groupId>
<artifactId>jalcal</artifactId>
<version>1.0</version>
</dependency>
1. Jalali à grégorien
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. Grégorien à Jalali
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");