使用 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));
如果我走错了方向或为我解决这个问题,请推荐不同的方法。提前致谢,我们将不胜感激。
- 您可以使用
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
但 .
了解有关 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 。
我有许多用于 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));
如果我走错了方向或为我解决这个问题,请推荐不同的方法。提前致谢,我们将不胜感激。
- 您可以使用
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
但
了解有关 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