首页 > 解决方案 > 如何处理带和不带区域的日期

问题描述

我的客户向我发送 ISO8601 中的日期,其中有时包含带区域的毫秒,有时不包含毫秒和区域。

例如:2019-05-01T06:55:43+01:00, 2019-05-01T06:55

我正在使用新的 Java 8 API(LocalDateTimeDateTimeFormatter)。

我没有找到一个Date带有格式化程序的类,它可以同时处理毫秒和区域,而没有这个。

我正在尝试使用单一格式进行输入日期验证

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(templateFormat, locale);


    try {
        ldt = LocalDateTime.parse(context, formatter );
        String result = ldt.format(formatter);
        return result.equals(context);
    } catch (DateTimeParseException e) {
        try {
            LocalDate ld = LocalDate.parse(context, formatter );
            String result = ld.format(formatter);
            return result.equals(context);

我问是否有缓存两者的格式化程序,我可以使用多个日期类,如果我失败继续下一个,例如(LocalDateTime,LocalDate,OffsetDateTime),但我需要使用单个格式化程序

标签: javadate

解决方案


不同种类

正如 Ole VV 评论的那样,您的输入:

  • 2019-05-01T06:55:43+01:00
  • 2019-05-01T06:55

…是两种不同的动物。

第一个代表一个时刻,时间线上的一个特定点。该值包括三个信息:

  • 日期
  • 一天中的时间
  • 与 UTC 的偏移

第二个输入只有日期和时间。它缺少时区offset-from-UTC的上下文。所以这个值不代表片刻。这不是时间线上的一个点。该值代表大约 26-27 小时范围内的潜在时刻,即全球时区范围。第二个是指东京的早上 6 点吗?还是巴黎,当早上 6 点出现在几个小时后?或者在早上 6 点到达魁北克时还要再等几个小时?

因此,如果您的数据源向您提供这些值的任意组合,您的数据源就会混淆或损坏。我建议咨询该数据的发布者以确定他们的意图,并可能教育他们了解含义的差异。

解析

例如:2019-05-01T06:55:43+01:00、2019-05-01T06:55

要回答您的具体问题:

DateTimeParseException. 如果在解析一个类时抛出,请尝试与其他类一起解析。

两个输入均采用标准ISO 8601格式。java.time类在解析/生成字符串时默认使用标准格式。因此无需指定格式模式。

try {
    OffsetDateTime odt = OffsetDateTime.parse( input ) ;
    …
} catch ( DateTimeParseException e ) {
    LocalDateTime ldt = LocalDateTime.parse( input ) ;
    …
}

推荐阅读