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

标签 java date datetime localdatetime datetimeformatter

我有多种格式的输入用于日期时间列,其中包括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,但 I prefer u to y .

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


* 无论出于何种原因,如果您必须坚持使用 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 - 使用 DateTimeFormatter 将不同格式的 DateTime 处理为唯一的格式,即最长的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68929025/

相关文章:

java - 实现实现接口(interface)的类的复制方法 - Java

php filemtime 24 小时格式

c# - 创建一个带有日期的新 .txt 文件,C#

javascript - 如何转义 date-fns 格式的模式字母

MySQL错误: Incorrect datetime value: '01/27/1989' for function str_to_date

javascript - 为什么我无法从给定字符串创建新的 Date() ?

java - 中止插入...选择子句

java - 在android中获取本地日期一样长,可能会感到困惑?

java - 如何用 JPanel 填充 JFrame 窗口?

sql - Clickhouse:如何将日期转换为长整数?