Java 时间解析具有短日期名称的日期

标签 java date datetime dayofweek date-parsing

我有以下德国日期:So, 18 Jul 2021 15:24:00 +0200

我无法使用 Java Time 解析它:

DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss Z", Locale.GERMANY)
  .parse("So, 18 Jul 2021 15:24:00 +0200", Instant::from)

因为它抛出:Text 'So, 18 Jul 2021 15:24:00 +0200' could not be parsed at index 0

如果我要更改字符串以使其格式正确,它会起作用:

-So, 18 Jul 2021 15:24:00 +0200
+So., 18 Juli 2021 15:24:00 +0200

是否有任何神奇的模式来解析上述日期?


我在其他日期也遇到了同样的问题

  • LocalDateTime.parse("ven, 16/07/2021 - 09:49", DateTimeFormatter.ofPattern("EE, dd/MM/yyyy - HH:mm", Locale("fr")))
    • ven 必须是 ven.
  • LocalDateTime.parse("vr, 23 apr 2021 17:04:00", DateTimeFormatter.ofPattern("EE, dd MM yyyy HH:mm:ss", Locale("nl")))
    • apr 必须是 04(为了使用 MM)

最佳答案

现代日期时间 API 对模式非常讲究。因此,几乎不可能创建可用于解析所有类型字符串的单一模式。然而,DateTimeFormatter 的最大特点之一是它可以灵活地处理可选模式,使用方括号指定,例如以下演示使用 E, d [MMMM][MMM][M] u H:m:s Z,它具有三种可选的月份模式。

演示:

import java.time.DateTimeException;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.stream.Stream;


public class Main {
    public static void main(String[] args) {
        Stream.of(
                "So., 18 Juli 2021 15:24:00 +0200",
                "ven., 16 avr. 2021 15:24:00 +0200",
                "vr, 16 apr. 2021 15:24:00 +0200",
                "vr, 16 07 2021 15:24:00 +0200"
        ).forEach(s -> {
            Stream.of(
                    Locale.GERMANY,
                    Locale.FRANCE,
                    new Locale("nl", "NL")
            ).forEach( locale -> {
                try {
                    System.out.println("Parsed '" + s + "' using the locale, " + locale + " => " + parseToInstant(s, locale));
                }catch(DateTimeException e) {
                    //....
                }
            });
        });
    }

    static Instant parseToInstant(String strDateTime, Locale locale) {
        return DateTimeFormatter.ofPattern("E, d [MMMM][MMM][M] u H:m:s Z").withLocale(locale).parse(strDateTime,
                Instant::from);
    }
}

输出:

Parsed 'So., 18 Juli 2021 15:24:00 +0200' using the locale, de_DE => 2021-07-18T13:24:00Z
Parsed 'ven., 16 avr. 2021 15:24:00 +0200' using the locale, fr_FR => 2021-04-16T13:24:00Z
Parsed 'vr, 16 apr. 2021 15:24:00 +0200' using the locale, nl_NL => 2021-04-16T13:24:00Z
Parsed 'vr, 16 07 2021 15:24:00 +0200' using the locale, nl_NL => 2021-07-16T13:24:00Z

ONLINE DEMO

DateTimeFormatterBuilder 中了解有关日期时间模式的更多信息.

关于Java 时间解析具有短日期名称的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68600971/

相关文章:

python - 在 Python 中验证 ISO-8601 日期时间字符串?

date - 获取 Lua 中的特定 UTC 日期和时间

mysql - 按日期连接两个表返回按日期分组的数据

python pandas 读取时间戳

java - 在 Android 中比较日期的最佳方法

javascript - 如何在 dmy 格式的日期之间循环

java - ElasticSearch 高级 API 使用自定义设置创建索引返回错误

java - 自定义 CacheResolver 不工作

java - 如何在没有 AlertDialog 的情况下在自定义对话框中实现取消按钮?

java - 如何让我的 Java 8 应用程序启用 JAWS 以帮助盲人用户?