Mer*_*men 11 java date arabic simpledateformat arabic-support
我正在使用阿拉伯语进行网络监控项目,我想像这样转换字符串日期:
??????? 24 ????? 2017 - 15:00
Run Code Online (Sandbox Code Playgroud)
到Java 8日期对象.我怎样才能做到这一点?
编辑:感谢苗条和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)
@Ole 和 @slim 的答案是有效的,但不是他们想象的那样。
\n\n第一个观察 - 对于给定的示例, nu 扩展是不必要的:
\n\nOles 建议也适用于语言环境,new Locale("ar", "SA")而不是Locale.forLanguageTag("ar-SA-u-nu-arab"). 那么这里的 unicode-nu-extension 是什么呢?没有什么。下一个问题:
nu-扩展在这里应该做什么?
\n\nnu 码字“arab”由 unicode 联盟指定,用于生成阿拉伯-印度数字。但要解析的输入只有西方数字 0-9(历史上这些数字是从阿拉伯人那里取代的,并指定为代码字“latn”——顺便说一下,这是一个用词不当)。因此,如果 nu 扩展确实在这里完成了它的工作,那么解析应该会失败,因为阿拉伯-印度数字不是 0-9,而是:
\n\n\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
显然,Java-8 中的新 time-API 一般不支持 nu-扩展。
\n\nSimpleDateFormat支持 nu- 扩展吗?
通过调试以下代码,我发现 nu-扩展仅支持泰语数字(另请参阅类的官方 javadoc,java.util.Locale但不支持阿拉伯语-印度数字:
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);\nRun Code Online (Sandbox Code Playgroud)\n\n我假设 Java-8 的类DateTimeFormatter也支持泰语数字。
结论:
\n\n忘记 nu- 扩展名。只需通过老式方式构建语言环境,无需 unicode 扩展,并以这种方式调整 Oles 答案。它之所以有效,是因为您的输入只有西文数字 0-9。
\n\n对于广泛的 i18n 支持,包括各种编号系统的 nu 扩展(如果您有此类输入),您可以考虑外部库(例如 ICU4J 或我的 lib Time4J)。
\n一种解决方案是将日期翻译成英语并解析它:
\n\nprivate 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}\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试复制月份,但我不相信我做得正确。put解析时 get的参数会被切换。
或者你看看Joda-Time。也许他们有解决办法。这里提到过。
\n| 归档时间: |
|
| 查看次数: |
1934 次 |
| 最近记录: |