ZonedDateTime 解析异常

问题描述 投票:0回答:4

我正在尝试将字符串转换为 ZonedDateTime。

我尝试过以下方法:

SimpleDateFormat zonedDateTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");   
zonedDateTimeFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 

long timeMs = zonedDateTimeFormat.parse("2017-07-18T20:26:28.582+03:00[Asia/Istanbul]").getTime();

它给出了

java.text.ParseException: Unparseable date

如何将以下字符串解析为 ZonedDateTime

2017-07-18T20:26:28.582+03:00[Asia/Istanbul]
java date parsing datetime zoneddatetime
4个回答
3
投票

java.time
API 有许多内置格式,可以简化解析和格式化过程。您尝试解析的字符串采用标准 ISO_ZONED_DATE_TIME 格式。因此,您可以通过以下方式轻松解析它,然后获取纪元中的毫秒数:

DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME ;
ZonedDateTime zdt = ZonedDateTime.parse(
                        "2017-07-18T20:26:28.582+03:00[Asia/Istanbul]", 
                        formatter);  // prints 2017-07-18T20:26:28.582+03:00[Asia/Istanbul]
long timeInMs = zdt.toInstant().toEpochMilli();

2
投票

ZonedDateTime.parse
似乎旨在处理您提供的确切字符串。没有必要经历旧的
SimpleDateFormat


2
投票

对于 ZonedDateTime,我们需要将

ZonedDateTime.parse
方法与
DateTimeFormatter
一起使用。如果我没记错的话,你有一个
ISO
日期:

 ZonedDateTime zonedDateTime = ZonedDateTime.parse(
         "2017-07-18T20:26:28.582+03:00[Asia/Istanbul]",
         DateTimeFormatter.ISO_DATE_TIME
 );
 System.out.println(zonedDateTime); //2017-07-18T20:26:28.582+03:00[Asia/Istanbul]

您可以使用

ISO_ZONED_DATE_TIME
ISO_DATE_TIME
。两者都能够解析带有偏移量和区域的日期时间。


0
投票

java.time

2014 年 3 月,Java 8 引入了现代的

java.time
日期时间 API,取代了容易出错的遗留
java.util
日期时间 API。任何新代码都应使用
java.time
API。如果您收到
java.util.Date
的实例,请使用
java.time.Instant
 将其转换为 
Date#toInstant
,并根据您的要求从中派生
java.time
的其他日期时间类。

使用现代日期时间 API 的解决方案

下面是摘自

ZonedDateTime#parse
文档

从文本字符串获取 ZonedDateTime 的实例,例如 2007-12-03T10:15:30+01:00[欧洲/巴黎]。该字符串必须代表一个 有效的日期时间并使用解析 DateTimeFormatter.ISO_ZONED_DATE_TIME。

由于您的文本字符串 2017-07-18T20:26:28.582+03:00[Asia/Istanbul] 完全符合默认格式,因此您无需显式指定任何

DateTimeFormatter

演示:

public class Main {
    public static void main(String[] args) {
        ZonedDateTime zdt = ZonedDateTime.parse("2017-07-18T20:26:28.582+03:00[Asia/Istanbul]");
        System.out.println(zdt);
    }
}

输出:

2017-07-18T20:26:28.582+03:00[Asia/Istanbul]

在线演示

Trail:日期时间了解有关现代日期时间 API 的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.