在 Java 中使用 DateTimeFormatter 解析 ZonedDateTime.now()
Parse ZonedDateTime.now() with DateTimeFormatter in Java
我正在尝试用特定格式解析当前时间戳,但每次尝试我都会得到 java.time.format.DateTimeParseException
。我的代码:
ZonedDateTime.parse(
ZonedDateTime.now().toString(),
DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss.SSS")
.withZone(ZoneId.of("UTC")) //I also tried ZoneId.systemDefault()
)
结果:
java.time.format.DateTimeParseException:
Text '2018-02-27T11:01:18.776+01:00[Europe/Berlin]' could not be parsed at index 2
问题是为什么我不能解析成想要的格式,如何实现?
P.S。我还看到 post 并尝试设置 ZoneId
但它没有帮助。
DateTimeFormat
"dd.MM.yyyy HH:mm:ss.SSS"
与 ZonedDateTime.now().toString()
生成的 '2018-02-27T11:01:18.776+01:00[Europe/Berlin]'
不匹配
这应该适用于转换 now()
结果 String --> Date,因为正确的格式化程序已经在 JDK:
String inputStr = ZonedDateTime.now().toString();
ZonedDateTime parsed = ZonedDateTime.parse(inputStr, DateTimeFormatter.ISO_DATE_TIME)
System.out.println(parsed);
如果您想改变方向,您可以通过
转换 Date --> String
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss.SSS");
String parsed = pattern.format(ZonedDateTime.now());
System.out.println(parsed);
您可以直接使用ZonedDateTime的格式化功能。例如:
String dateString = ZonedDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
你也可以看看:
- How to parse/format dates with LocalDateTime? (Java 8)
- https://www.mscharhag.com/java/java-8-date-time-api
要解析来自 ZonedDateTime.toString()
的结果,您根本不需要显式格式化程序:
System.out.println(ZonedDateTime.parse(
ZonedDateTime.now(ZoneId.of("Asia/Kuala_Lumpur")).toString()));
此打印
2018-02-27T21:48:16.214832+08:00[Asia/Kuala_Lumpur]
您问题中的格式化程序非常适合格式化:
System.out.println(ZonedDateTime.now(ZoneId.of("Asia/Kuala_Lumpur"))
.format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss.SSS")));
这打印了:
27.02.2018 21:48:16.237
你有没有混淆这个词的用法? 解析 意味着分析字符串以理解它,在本例中将其转换为 date-time 对象,如 ZonedDateTime
。相反的转换称为 格式化,将 date-time 对象转换为特定格式的字符串,通常用于人类可读性或数据交换。
我正在尝试用特定格式解析当前时间戳,但每次尝试我都会得到 java.time.format.DateTimeParseException
。我的代码:
ZonedDateTime.parse(
ZonedDateTime.now().toString(),
DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss.SSS")
.withZone(ZoneId.of("UTC")) //I also tried ZoneId.systemDefault()
)
结果:
java.time.format.DateTimeParseException:
Text '2018-02-27T11:01:18.776+01:00[Europe/Berlin]' could not be parsed at index 2
问题是为什么我不能解析成想要的格式,如何实现?
P.S。我还看到 ZoneId
但它没有帮助。
DateTimeFormat
"dd.MM.yyyy HH:mm:ss.SSS"与
ZonedDateTime.now().toString()生成的
'2018-02-27T11:01:18.776+01:00[Europe/Berlin]'不匹配
这应该适用于转换 now()
结果 String --> Date,因为正确的格式化程序已经在 JDK:
String inputStr = ZonedDateTime.now().toString();
ZonedDateTime parsed = ZonedDateTime.parse(inputStr, DateTimeFormatter.ISO_DATE_TIME)
System.out.println(parsed);
如果您想改变方向,您可以通过
转换 Date --> String DateTimeFormatter pattern = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss.SSS");
String parsed = pattern.format(ZonedDateTime.now());
System.out.println(parsed);
您可以直接使用ZonedDateTime的格式化功能。例如:
String dateString = ZonedDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
你也可以看看:
- How to parse/format dates with LocalDateTime? (Java 8)
- https://www.mscharhag.com/java/java-8-date-time-api
要解析来自 ZonedDateTime.toString()
的结果,您根本不需要显式格式化程序:
System.out.println(ZonedDateTime.parse(
ZonedDateTime.now(ZoneId.of("Asia/Kuala_Lumpur")).toString()));
此打印
2018-02-27T21:48:16.214832+08:00[Asia/Kuala_Lumpur]
您问题中的格式化程序非常适合格式化:
System.out.println(ZonedDateTime.now(ZoneId.of("Asia/Kuala_Lumpur"))
.format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss.SSS")));
这打印了:
27.02.2018 21:48:16.237
你有没有混淆这个词的用法? 解析 意味着分析字符串以理解它,在本例中将其转换为 date-time 对象,如 ZonedDateTime
。相反的转换称为 格式化,将 date-time 对象转换为特定格式的字符串,通常用于人类可读性或数据交换。