2

我为 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));

如果我走错了,请推荐一种不同的方法或为我解决这个问题。在此先感谢您的帮助,我们将不胜感激。

4

1 回答 1

4
  1. 您可以使用DateTimeFormatterBuilder#parseDefaulting并保留方括号内的可选模式。
  2. 我也强烈建议用它DateTimeFormatterBuilder#parseCaseInsensitive来处理case(例如AM/am)。
  3. 另外,永远不要忘记Locale与 a一起使用,DateTimeFormatter因为它是-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我更u喜欢y.

Trail: Date Time了解有关现代日期时间 API *的更多信息。


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

于 2021-08-25T20:03:46.347 回答