Joda时间希伯来语的无效格式异常



我想尝试在Java-11上解析如此简单的日期。

日期语言为:希伯来语日期格式为:";MMM-YYYY-dd";示例日期是:";2010年6月18日;

我的代码看起来像:

DateTimeFormatter f = DateTimeFormat.forPattern("MMM YYYY dd")
.withLocale(Locale.forLanguageTag("iw-IL"));
String dateInString = "18 אוק 2010";
Date d = f.parseDateTime(dateInString).toDate();
System.out.println(d);

但当我尝试时,我会得到一个错误,比如:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "18 אוק 2010" is malformed at "אוק 2010"
at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:945)

有什么建议吗?

阅读方向

您的格式模式字符串MMM YYYY dd表示月份缩写首先出现,然后是年份,然后是月份的日期。从外观上看是不可能的,但当我复制粘贴你的日期字符串18 אוק 2010时,首先是月的哪一天(18(,然后是月的缩写(对10月的缩写(,最后是年(2010(。由于希伯来语是从右到左读取的,其余的从左到右读取,所以这两种情况下的字符串看起来都是一样的。由于在幕后订单确实不一致,解析失败。

因此,解决方案有两个(至少(:

  1. 修复日期字符串以匹配格式模式。

  2. 修复您的格式模式以匹配日期字符串:

    DateTimeFormatter f = DateTimeFormat.forPattern("dd MMM YYYY")
    .withLocale(Locale.forLanguageTag("iw-IL"));
    

在后一种情况下,代码的输出是(在我的时区中(:

10月18日星期一00:00:00 CEST 2010

并非所有Java版本都能轻松使用

…但这在java-11上不起作用。但它适用于java-8

这是因为Java 9中的默认区域设置数据发生了更改。在Java 8之前,Java自己的区域设置数据被用作默认值。From Java 9 CLDR(Unicode通用区域设置日期存储库(是默认值。在这里,十月的希伯来语缩写是Şدد。有关如何解析Java 9、11及更高版本中的字符串,请参阅JDK dateformatter解析德语语言环境中的DayOfWeek,java8与java9。

最新更新