【发布时间】:2015-08-29 05:28:09
【问题描述】:
我需要解析以下形式的(德语)日期:
10. Jan. 18:14
8. Feb. 19:02
1. Mär. 19:40
4. Apr. 18:55
2. Mai 21:55
5. Juni 08:25
5. Juli 20:09
1. Aug. 13:42
[...]
如您所见,如果月份超过 4 个字符,则月份名称将被删除。更奇怪的是,别问我为什么,虽然全名是März,但三月份缩短为Mär.。我如何用java.time 解析这个?
(日期的格式是基于创建日期列表的 android 设备的本地化。但是,我不会在 Android 上解析它)
我的方法是像这样创建DateTimeFormatter:
DateTimeFormatter.ofPattern("d. MMMM HH:mm").withLocale(Locale.GERMAN);
// or
DateTimeFormatter.ofPattern("d. MMMMM HH:mm").withLocale(Locale.GERMAN);
但是MMMM 和MMMMM 模式都不适合缩短的日期。当然,我可以使用以下模式d. MMM. HH:mm 来匹配缩短的月份,但是我无法匹配 3 和 4 个字符的月份。我知道我可以有两个格式化程序 (MMM. and MMMMM),但我宁愿有一个解决方案,我只有一个格式化程序,可能还有一个自定义语言环境或类似的东西。
【问题讨论】:
-
如果您可以控制该 Android 应用,最好让它以标准格式发送日期。本地化格式实际上应该只用于用户交互,而不是用于数据交换。如果没有,我认为您可能应该在解析之前删除空格之前的字符。
-
不幸的是,我无法控制 Android 应用程序,否则我会以结构化形式传输数据并使用 unix 时间戳记日期 :-)。只是删除空格之前的字符,即点,并没有帮助,因为它仍然让我在缩短的月份名称和全名之间混合。
-
不,如果您删除空格前的字符,它还会将 Juli 和 Juni 缩短为 Jul 和 Jun。
-
然后Mai变成了Ma。 März 的正确短月是 Mrz。因为除了德语还有其他本地化版本,我更喜欢一种不需要针对特殊情况更改代码的方法。
-
啊,我错过了。在这种情况下,我认为您最好的选择是创建一种方法,在解析之前将非标准月份名称简单地替换为标准月份名称。
标签: java datetime localization java-8 java-time