【问题标题】:Process different formats of DateTime using DateTimeFormatter to a unique format which is the longest format使用 DateTimeFormatter 将不同格式的 DateTime 处理为最长的唯一格式
【发布时间】:2021-10-25 22:53:55
【问题描述】:

我为 DateTime 列提供了多种输入格式,其中包括 1."MM/dd/yyyy HH:mm:ss a" 2."MM/dd/yyyy HH:mm:ss" 3." MM/dd/yyyy HH:mm" 4."yyyyMMdd"

这应该被格式化并给我一个最长格式的输出,即 1."MM/dd/yyyy HH:mm:ss a" 填充剩余的格式00 值,如果不存在。

这就是我正在尝试的:

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(""
                + "[MM/dd/yyyy HH:mm:ss a]"
                + "[MM/dd/yyyy HH:mm:ss]"
                + "[MM/dd/yyyy HH:mm]"
                + "[yyyyMMdd]");


return
me.setManufacturingDate(LocalDateTime.parse(mm.getManufacturingDate().toString(),
                    dateFormatter));

如果我走错路或为我解决此问题,请推荐一种不同的方法。提前致谢,我们将不胜感激。

【问题讨论】:

  • 为什么不使用String[],迭代和捕获异常?
  • 我之前使用 try-catch 块,只是寻求一种不同的形式来减少代码的行和重复

标签: java date datetime localdatetime datetimeformatter


【解决方案1】:
  1. 您可以使用DateTimeFormatterBuilder#parseDefaulting 并将可选模式保留在方括号内。
  2. 我也强烈建议使用DateTimeFormatterBuilder#parseCaseInsensitive 处理大小写(例如AM/am)。
  3. 此外,永远不要忘记将LocaleDateTimeFormatter 一起使用,因为它是Locale 敏感类型。
  4. 最后但同样重要的是,请注意H 用于 24 小时格式,而 h 用于 12 小时格式。

演示:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
                .parseCaseInsensitive()
                .appendPattern("[MM/dd/uuuu hh:mm:ss a][MM/dd/uuuu HH[:mm[:ss]]][uuuuMMdd[ hh:mm:ss a]")
                .parseDefaulting(ChronoField.CLOCK_HOUR_OF_AMPM, 0)
                .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                .toFormatter(Locale.ENGLISH);

        // Test
        String[] arr = { "08/25/2021 10:20:30 am", "08/25/2021 10:20:30", "08/25/2021 10:20", "20210825" };

        for (String s : arr) {
            LocalDateTime ldt = LocalDateTime.parse(s, dateFormatter);
            System.out.println(ldt);
        }
    }
}

输出:

2021-08-25T10:20:30
2021-08-25T10:20:30
2021-08-25T10:20
2021-08-25T00:00

ONLINE DEMO

注意:您可以使用y 代替uI prefer u to y

通过 Trail: Date Time 了解有关 modern Date-Time API* 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

【讨论】:

  • 嗨,对我来说,使用上述解决方案会引发以下错误:错误:java.time.format.DateTimeParseException:无法解析文本“8”,在索引 0 处找到未解析的文本输入:08/ 25/2021 上午 10:20:30
  • @RakeshKumar - 我还链接了一个在线编辑器,它运行时没有任何问题。你用的JDK是什么版本的?
  • 嗨 Arvind,抱歉,我看到它在您分享的演示中运行良好,但我正在尝试找出可能是我的问题,顺便说一句,我使用的是 14.0.2 版本
  • @RakeshKumar - Here 是另一个在线编辑器,您可以在其中复制和粘贴我的代码并执行。
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多