伊斯兰日期的 Joda 时间格式tl;博士java.time关于 java.time

2022-09-03 15:58:26

我正在使用Joda-Time在dd MMMM y中获取伊斯兰日期,但我总是得到dd MM yyyy。

有什么建议吗?可能是回历日期不支持格式化?在Joda-Time网站上尚不清楚。

 DateTime dtISO = new DateTime(2014,2,25,0,0,0,0);
 DateTime dtIslamic = dtISO.withChronology(IslamicChronology.getInstance());
 String formatIslamic= "dd MMMM yyyy";
 DateTimeFormatter formatter = DateTimeFormat.forPattern(formatIslamic).withChronology( IslamicChronology.getInstance());
 String islamicDateString = formatter.print(dtIslamic);

答案 1

目前尚未实现此目的。BasicChronology 类将 monthOfYear 字段设置为使用 GJMonthOfYearDateTimeField,后者又从 java.text.DateFormatSymbols 获取数据。伊斯兰年表使用将 monthOfYear 字段设置为 BasicMonthOfYearDateTimeField,该字段具有以下 getAsText 实现:

public String getAsText(int fieldValue, Locale locale) {
    return Integer.toString(fieldValue);
}

有人需要做的是创建一个IslamisMonthOfYearDateTimeField,该Field扩展BasicMonthOfYearDateTimeField并覆盖该方法,以便它返回月份的名称而不是月份的数值。这可以在joda时间代码库中完成,也可以完全在外部完成。要让它在joda之外工作,只需扩展IslamisChronology并覆盖汇编以拉入您的新IslamisMonthOfYearDateTimeField。我会向joda-time自己发出拉取请求,但我怀疑他们会接受非本地化的解决方案。


答案 2

tl;博士

java.time.chrono.HijrahDate.from(
    LocalDate.of( 2014 , 2 , 25 ) 
)
.get( ChronoField.YEAR )

1435

java.time

Joda-Time项目现在处于维护模式,建议迁移到java.time类。

java.time类在java.time.chrono包中提供了HijrahChronologyHijrahDate

对于Java 6和7以及早期的Android,ThreeTen-Backport项目还提供了HijrahChronology和.HijrahDate

LocalDate ld = LocalDate.of( 2014 , 2 , 25 ) ;
HijrahDate hd = HijrahDate.from( ld  );
String output = hd.toString() ;

输出: 希吉拉-乌马尔库拉 AH 1435-04-25

至于其他格式,方法似乎恢复到ISO年表。formatDateTimeFormatter

Locale locale = Locale.forLanguageTag( "en-US-u-ca-islamic-umalqura" );
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( locale );
String output2 = hd.format( f );

产出2: 星期二, 二月 25, 2014

虽然我现在没有时间这样做,但我建议查看HijrahDate::toString方法的源代码。

您可以使用 java.time.chrono 包文档中的示例代码来滚动自己的格式设置。

int day = hd.get( ChronoField.DAY_OF_MONTH );
int dow = hd.get( ChronoField.DAY_OF_WEEK );
int month = hd.get( ChronoField.MONTH_OF_YEAR );
int year = hd.get( ChronoField.YEAR );
System.out.printf( "%s %s %d-%s-%d%n" , hd.getChronology().getId() , dow , day , month , year );

Hijrah-umalqura 2 25-4-1435


另请参阅:

用java格式将贾拉利日历转换为格鲁吉亚语

从回历日期字符串中获取公历日期


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,如java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。java.sql.*

从哪里获取 java.time 类?

ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter