java - DateTimeParseException:无法解析文本“2019-06-07 12:18:16”
问题描述
我有以下代码将 Instant 转换为 String 然后将其转换回 I
String timestampString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"));
LOGGER.info("timestampString: " + timestampString);
Instant instant =
LocalDateTime.parse(timestampString,
DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss")).toInstant(ZoneOffset.UTC);
它将时间戳字符串打印为: 2019-06-07 12:45:57
并未能解析字符串:
java.time.format.DateTimeParseException: Text '2019-06-07 12:45:57' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MinuteOfHour=45, HourOfAmPm=0, NanoOfSecond=0, SecondOfMinute=57, MilliOfSecond=0, MicroOfSecond=0},ISO resolved to 2019-06-07 of type java.time.format.Parsed
为什么即使它与我将时间戳转换成的格式相同,它也无法解析它?
解决方案
使用 HH 代替 hh
您要问的问题是您hh
在格式模式字符串中使用小写字母(两次)。HH
您需要从 00 到 23 的小时日的大写。hh
是从 01 到 12 的上午或下午的小时。所以出了问题的是 java.time 不知道12
在您的字符串中是指 12 AM 还是 12 PM 并且拒绝给你做个猜测。
如果您仔细阅读异常消息,您还会注意到它表示HourOfAmPm=0
已解析。它没有说HourOfDay
。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String timestampString = LocalDateTime.now().format(formatter);
System.out.println("timestampString: " + timestampString);
Instant instant = LocalDateTime.parse(timestampString, formatter)
.toInstant(ZoneOffset.UTC);
System.out.println("instant: " + instant);
当我刚才运行这个片段时,我得到了这个输出:
timestampString: 2019-06-08 19:22:51 instant: 2019-06-08T19:22:51Z
这是错误的!我在世界标准时间 17:22 左右运行了该片段,而不是 19:22。由于丹麦仍在使用夏令时(该死),因此这里的当地时间是 19:22,用于计算结果并转换为 UTC 中相同的挂钟时间,而不是同一时刻。您应该始终将所需的时区传递给该now
方法以避免此类错误。既然你想要UTC:
String timestampString = LocalDateTime.now(ZoneOffset.UTC).format(formatter);
timestampString: 2019-06-08 17:27:57 instant: 2019-06-08T17:27:57Z
更好的是,不要用LocalDateTime
它来拿一些你想在某个时刻使用的东西。使用Instant
,OffsetDateTime
或ZonedDateTime
代替。
在这个问题及其答案中有更多关于使用hh
或格式化和解析小时值HH
的信息:Difference between java HH:mm and hh:mm on SimpleDateFormat 。问题是关于臭名昭著的麻烦,但答案也是有效的。kk
SimpleDateFormat
DateTimeFormatter
推荐阅读
- mysql - 如何在 Oracle 的日期中添加一天的最后一小时?
- java - 发生在 Volatile 的保证之前
- python - 如何修复 SimpleImputer:“ValueError:输入包含 NaN、无穷大或对于 dtype 而言太大的值”
- swift - 隐式初始化调用如何可选?
- paypal - PayPal 结帐:是否有关于 `createOrder` 和 `onApprove` 函数的 `actions` 参数的文档?
- c# - 在发布请求中看不到土耳其语字符
- python - 如何在 Python 的热键挂钩中获取按键键盘源?
- c++ - 问题是 C++ 中的“错误:需要分号”
- model - UI5 文档说明:UI5 中的模型定义
- android - Android Kotlin 更改 RecyclerView 中的 ImageView 图像源