我有多种格式的输入用于日期时间列,其中包括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));
如果我的方向错误,请推荐一种不同的方法或为我解决这个问题。提前致谢,我们将不胜感激任何帮助。
最佳答案
- 您可以使用
DateTimeFormatterBuilder#parseDefaulting
并将可选模式保留在方括号内。 - 我也强烈建议使用
DateTimeFormatterBuilder#parseCaseInsensitive
处理案件(例如 AM/am)。 - 此外,永远不要忘记将
Locale
与DateTimeFormatter
一起使用,因为它是Locale
敏感类型。 - 最后但并非最不重要的一点是,请注意
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
注意:您可以使用 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 desugaring和 How to use ThreeTenABP in Android Project 。
关于java - 使用 DateTimeFormatter 将不同格式的 DateTime 处理为唯一的格式,即最长的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68929025/