我正在尝试将字符串转换为 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.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();
对于 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
。两者都能够解析带有偏移量和区域的日期时间。
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
的其他日期时间类。
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 的更多信息。