在HijrahChronology中配置自定义变体以进行日期更正jdk 8

时间:2018-06-25 04:48:57

标签: java javafx java-8 javafx-8 java-time

我在javafx中使用了DatePicker-JDK 8,并使用了HijrahChronology.INSTANCE-这样日期选择器可以显示日历-一切正常,但是公历和hijri日历之间相差1天。回历日历落后1天。

我正在尝试按照以下链接更改变体 https://bugs.openjdk.java.net/browse/JDK-8187987

但无法成功。请对此问题进行解释或提出更好或更清晰的解决方案。

代码:

HijrahChronology hijriChronology = HijrahChronology.INSTANCE;
    dateOfTransaction.setChronology(hijriChronology);

dateOfTransaction是JavaFx中DatePicker的实例 除非那是唯一的解决方法,否则我也不想使用Joda Time。

2 个答案:

答案 0 :(得分:1)

不幸的是,Java(8到10)不支持在运行时提供自定义的Hijrah变体(这是我几个月前提交的相关错误报告:https://bugs.openjdk.java.net/browse/JDK-8187987)。 但是,有两种解决方法: 1-操纵JRE随附的默认hijrah变体。在Java 8中,可以在以下位置找到它:   C:\ Program Files \ Java \ jdk1.8.0_162 \ jre \ lib \ hijrah-config-umalqura.properties 在Java 9和10中,它捆绑在以下位置:   /java/time/chrono/hijrah-config-islamic-umalqura.properties 2-您可以在运行时使用Reflection API注入自定义的Hijrah变体: 公共静态无效injectCustomHijriVariant(Map yearMonthsMap,long isoStartDate)         引发NoSuchFieldException,IllegalAccessException,NoSuchMethodException,InvocationTargetException {     int minYear = Integer.MAX_VALUE;     int maxYear = Integer.MIN_VALUE;     for(int年:yearMonthsMap.keySet())     {         maxYear = Math.max(maxYear,year);         minYear = Math.min(minYear,year);     }     int isoStart =(int)LocalDateTime.ofInstant(Instant.ofEpochMilli(isoStartDate),                                                  ZoneId.systemDefault())。toLocalDate()。toEpochDay();     字段initCompleteField = HijrahChronology.class.getDeclaredField(“ initComplete”);     initCompleteField.setAccessible(true);     initCompleteField.set(HijrahChronology.INSTANCE,true);     字段hijrahStartEpochMonthField = HijrahChronology.class.getDeclaredField(“ hijrahStartEpochMonth”);     hijrahStartEpochMonthField.setAccessible(true);     hijrahStartEpochMonthField.set(HijrahChronology.INSTANCE,minYear * 12);     字段minEpochDayField = HijrahChronology.class.getDeclaredField(“ minEpochDay”);     minEpochDayField.setAccessible(true);     minEpochDayField.set(HijrahChronology.INSTANCE,isoStart);     方法createEpochMonthsMethod = HijrahChronology.class.getDeclaredMethod(“ createEpochMonths”,int.class,                                                                               int.class,int.class,Map.class);     createEpochMonthsMethod.setAccessible(true);     int [] hijrahEpochMonthStartDays =(int [])createEpochMonthsMethod.invoke(HijrahChronology.INSTANCE,isoStart,minYear,maxYear,years);     字段hijrahEpochMonthStartDaysField =                                         HijrahChronology.class.getDeclaredField(“ hijrahEpochMonthStartDays”);     hijrahEpochMonthStartDaysField.setAccessible(true);     hijrahEpochMonthStartDaysField.set(HijrahChronology.INSTANCE,hijrahEpochMonthStartDays);     字段maxEpochDayField = HijrahChronology.class.getDeclaredField(“ maxEpochDay”);     maxEpochDayField.setAccessible(true);     maxEpochDayField.set(HijrahChronology.INSTANCE,hijrahEpochMonthStartDays [hijrahEpochMonthStartDays.length-1]);     方法getYearLengthMethod = HijrahChronology.class.getDeclaredMethod(“ getYearLength”,int.class);     getYearLengthMethod.setAccessible(true);     字段minYearLengthField = HijrahChronology.class.getDeclaredField(“ minYearLength”);     minYearLengthField.setAccessible(true);     字段maxYearLengthField = HijrahChronology.class.getDeclaredField(“ maxYearLength”);     maxYearLengthField.setAccessible(true);     for(int year = minYear; year

答案 1 :(得分:0)

我使用的是 JDK 15,我认为可以这样做:

  1. 在 jdk 中从 hijrah-config-Hijrah-umalqura_islamic-umalqura.properties 复制 java/time/chrono
  2. 手动修复副本中的问题 - 主要是过去几年(根据 http://www.ummulqura.org.sa/Index.aspx
  3. 使用 the source code for HijrahChronology 中描述的机制加载副本 (JVM 在 <JAVA_HOME>/conf/chronology 目录中查找 Hijrah chronology 变体属性文件)
  4. 尝试使用 Chronology.ofLocale 设置默认年表,如 javadoc for HijrahChronology
  5. 中所述
<块引用>

注意,以上步骤是基于理解的,需要先测试一下。