¿Un buen convertidor de fechas para Jalali Calendar en Java?

Estoy desarrollando una aplicación Java y tengo un timeStamp (en Long ). Puedo usar fácilmente este código para cambiarlo a una fecha gregoriana:

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

Pero necesito tener la fecha en el calendario de Jalali. Busqué pero no encontré ninguna buena biblioteca. ¿Conoces una biblioteca confiable y buena para convertir (o crear fechas en formato timeStamp )? No necesito su implementación o un algoritmo, porque este problema es demasiado problemático y tiene muchas reglas, necesito una solución confiable

Gracias.

Eche un vistazo a esto: https://github.com/amirmehdizadeh/JalaliCalendar

El código se ve bien, proyecto basado en Maven, muchas pruebas unitarias.

Para una mejor localización y soporte de idioma, a menudo es conveniente usar la biblioteca de ICU (International Components for Unicode) de IBM.

Las API son similares a las API Java estándar, pero agregan soporte adicional para la localización e internacionalización (por ejemplo, problemas de tiempo y calendario, clasificación, reglas de formato y una implementación de expresión regular con la compatibilidad adecuada con Unicode).

Para crear un calendario persa y generar la fecha formateada en farsi, por ejemplo, haría algo como esto:

 import com.ibm.icu.text.DateFormat; import com.ibm.icu.util.Calendar; import com.ibm.icu.util.ULocale; ... ULocale locale = new ULocale("[email protected]=persian"); Calendar calendar = Calendar.getInstance(locale); DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, locale); System.out.println(df.format(calendar)); 

Esto dará como resultado:

چهارشنبه ۱۰ اردیبهشت ۱۳۹۳ ه‍.ش.

Desarrollé mi propio calendario persa (jalali) en Java dentro de mi biblioteca Time4J . La implementación implementa el algoritmo de Borkowski (válido al menos hasta el año gregoriano 2129 – no 2025-bug).

Solución para el problema concreto de 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 

Por supuesto, el calendario ofrece más funciones como la aritmética de fechas (agregando días o meses, calculando el delta en días, meses, etc.) o manipulaciones de campos / elementos (fácil para el último día del mes, etc.).

Notas laterales sobre otras bibliotecas propuestas aquí hasta ahora:

Las bibliotecas amirmehdizadeh / JalaliCalendar e ICU4J usan meses basados ​​en cero . Esto puede ser extremadamente confuso. Ejemplo no intuitivo usando la biblioteca de 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) 

Acerca de la internacionalización , no creo que ICU4J ofrezca más que Time4J en el área del calendario persa, ya que este último también se basa en la versión más nueva de CLDR v28. Time4J en realidad soporta alrededor de 25 idiomas para los meses y eras persas (incluyendo Farsi y Pashto).

Hay una buena biblioteca en github que tiene una API muy simple y tiene muchas capacidades y también está disponible en mavenCentral:

https://github.com/razeghi71/JalaliCalendar

Puede usar JalCal que Jalali (persa) Calender Convertor en Java:

  com.github.sbahmani jalcal 1.0  

1. Jalali a gregoriano.

  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. Gregoriano a 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"); 

Puede encontrar un calendario gráfico Jalali basado en Java llamado persain-calendar . Aquí hay una captura de pantalla del calendario persa.

Calendario persa