使用 DateTimeFormatter 将不同格式的 DateTime 处理为最长格式的唯一格式

Process different formats of DateTime using DateTimeFormatter to a unique format which is the longest format

我有许多用于 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));

如果我走错了方向或为我解决这个问题,请推荐不同的方法。提前致谢,我们将不胜感激。

  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 而不是 u.

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


* 无论出于何种原因,如果您必须坚持Java 6 或Java 7,您可以使用ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and