如何将阿拉伯字符串日期转换为java 8日期对象?

Mer*_*men 11 java date arabic simpledateformat arabic-support

我正在使用阿拉伯语进行网络监控项目,我想像这样转换字符串日期:

??????? 24 ????? 2017 - 15:00
Run Code Online (Sandbox Code Playgroud)

到Java 8日期对象.我怎样才能做到这一点?

Ole*_*.V. 9

编辑:感谢苗条和Meno Hochschild的灵感:

String dateTimeString = "??????? 24 ????? 2017 - 15:00";

DateTimeFormatter formatter
        = DateTimeFormatter.ofPattern("EEEE d MMMM uuuu - HH:mm", new Locale("ar"));
LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);
System.out.println(dateTime);
Run Code Online (Sandbox Code Playgroud)

这打印:

2017-04-24T15:00
Run Code Online (Sandbox Code Playgroud)


Men*_*ild 5

@Ole 和 @slim 的答案是有效的,但不是他们想象的那样。

\n\n

第一个观察 - 对于给定的示例, nu 扩展是不必要的:

\n\n

Oles 建议也适用于语言环境,new Locale("ar", "SA")而不是Locale.forLanguageTag("ar-SA-u-nu-arab"). 那么这里的 unicode-nu-extension 是什么呢?没有什么。下一个问题:

\n\n

nu-扩展在这里应该做什么?

\n\n

nu 码字“arab”由 unicode 联盟指定,用于生成阿拉伯-印度数字。但要解析的输入只有西方数字 0-9(历史上这些数字是从阿拉伯人那里取代的,并指定为代码字“latn”——顺便说一下,这是一个用词不当)。因此,如果 nu 扩展确实在这里完成了它的工作,那么解析应该会失败,因为阿拉伯-印度数字不是 0-9,而是:

\n\n
\n

\xd9\xa0 \xd9\xa1 \xd9\xa2 \xd9\xa2 \xd9\xa3 \xd9\xa4 \xd9\xa5 \xd9\xa6 \xd9\xa7 \xd9\xa8 \xd9\xa9

\n
\n\n

显然,Java-8 中的新 time-API 一般不支持 nu-扩展。

\n\n

SimpleDateFormat支持 nu- 扩展吗?

\n\n

通过调试以下代码,我发现 nu-扩展仅支持泰语数字(另请参阅类的官方 javadoc,java.util.Locale但不支持阿拉伯语-印度数字:

\n\n
SimpleDateFormat sdf = \n    new SimpleDateFormat("EEEE d MMMM yyyy - HH:mm", Locale.forLanguageTag("ar-SA-nu-arab"));\nDate d = sdf.parse(dateTimeString);\nSystem.out.println(d);\nString formatted = sdf.format(d);\nSystem.out.println(formatted);\nSystem.out.println(sdf.format(d).equals(dateTimeString));\n\nsdf = new SimpleDateFormat("EEEE d MMMM uuuu - HH:mm", Locale.forLanguageTag("ar-SA-u-nu-thai"));\nString thai = sdf.format(d);\nSystem.out.println("u-nu-thai: " + thai);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我假设 Java-8 的类DateTimeFormatter也支持泰语数字。

\n\n

结论:

\n\n

忘记 nu- 扩展名。只需通过老式方式构建语言环境,无需 unicode 扩展,并以这种方式调整 Oles 答案。它之所以有效,是因为您的输入只有西文数字 0-9。

\n\n

对于广泛的 i18n 支持,包括各种编号系统的 nu 扩展(如果您有此类输入),您可以考虑外部库(例如 ICU4J 或我的 lib Time4J)。

\n


Obe*_*and 0

一种解决方案是将日期翻译成英语并解析它:

\n\n
private final static Map<String, Integer> monthMapping = new HashMap<>();\nstatic {\n    // list of all month.\n    monthMapping.put("\xd8\xa3\xd8\xa8\xd8\xb1\xd9\x8a\xd9\x84", "4");\n}\n\n\npublic Date fromArabicToDate(String arabicInput) throws ParseException {\n    String[] parts = arabicInput.split(" ");\n    if (parts.length != 4) \n        throw new IllegalArgumentException();\n\n    String dateInput = parts[0] + "-" + monthMapping.get(parts[1]) + "-" + parts[2];\n    SimpleDateFormat parser = new SimpleDateFormat("YYYY-MM-DD");\n    return parser.parse(dateInput);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试复制月份,但我不相信我做得正确。put解析时 get的参数会被切换。

\n\n

或者你看看Joda-Time。也许他们有解决办法。这里提到过。

\n