java - 将字符串解析为特定格式的日期
问题描述
我有一个具有以下格式的字符串,String stringDate = "2019-04-25T07:03:17.428Z";
我需要将其转换为格式为 2019-04-25 07:03:17 的 LocalDateTime 对象
我试过了,LocalDateTime.parse(stringDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
但我得到了这个解析异常:
Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-04-25T07:03:17.428Z' could not be parsed at index 10
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
at com.company.Main.main(Main.java:12)
转换为特定格式的方法是什么?
解决方案
你要求的(但不想要的)
String stringDate = "2019-04-25T07:03:17.428Z";
LocalDateTime ldt = LocalDateTime.parse(stringDate, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
.truncatedTo(ChronoUnit.SECONDS);
System.out.println(ldt);
输出是
2019-04-25T07:03:17
它给了你你想要的东西,但正如rzwitserloot在另一个答案中指出的那样,它没有意义。它忽略了字符串中的偏移量Z
。偏移量对于将日期和时间解释为时间点至关重要。如果该字符串是2019-04-25T07:03:17.428+13:00
相反的,即使该字符串表示早于 13 小时的时间点,您仍然会得到相同的输出。
调用truncatedTo()
摆脱了秒的一小部分。如果你能忍受那几分之一秒,那就不要打那个电话了。
你可能想要什么
为了更明智的转换:
ZoneId zone = ZoneId.of("Europe/Zagreb");
Instant pointInTime = Instant.parse(stringDate);
LocalDateTime ldt = pointInTime.atZone(zone)
.toLocalDateTime()
.truncatedTo(ChronoUnit.SECONDS);
System.out.format("Date and time in %s: %s%n", zone, ldt);
欧洲/萨格勒布的日期和时间:2019-04-25T09:03:17
现在时间 07:03 UTC 已转换为 09:03 中欧夏令时间。
编辑:如果您确实需要LocalDateTime
UTC,例如对于需要此的数据库列,您可以通过这种方式在代码中明确说明这一事实:
LocalDateTime ldt = pointInTime.atOffset(ZoneOffset.UTC)
.toLocalDateTime()
.truncatedTo(ChronoUnit.SECONDS);
System.out.format("Date and time in UTC: %s%n", ldt);
UTC 日期和时间:2019-04-25T07:03:17
你的代码出了什么问题?
要了解您失败的原因,让我们看看您收到的异常消息:
无法在索引 10 处解析文本“2019-04-25T07:03:17.428Z”
索引 10 是T
表示时间部分开始的位置。让我们与您的格式模式字符串进行比较:yyyy-MM-dd HH:mm:ss
. T
这在时间部分之前有一个空格而不是一个。这就是异常的原因。如果您需要在模式中指定 aT
必须存在,我们需要将其括在单引号中,例如yyyy-MM-dd'T'HH:mm:ss
.
推荐阅读
- assembly - 英特尔 64/IA32 四字压缩水平加法?
- ckan - 在 CKAN 中获取包的 HarvestSource
- python - 如何均匀拆分具有不均匀类的数据集
- javascript - 预期 '===' 而是看到 '==' eqeqeq
- java - 使用 java.io.file 的詹金斯管道总是引用主
- javascript - 如何在没有 JavaScript 的情况下运行我的搜索框?
- java - 尝试查找元素时如何使用 Stream on List 引发异常?
- javascript - 在 Javascript 中单击按钮时添加/删除一行
- r - 被R卡住了!(循环和线性模型)
- amazon-web-services - AWS NLB 是否在终止 TLS 时传递 SNI 值?(通过 SNI 路由)