我收到此错误 java.text.ParseException: Unparseable date: "2017-03-09T18:30:00.000Z"
Posted
技术标签:
【中文标题】我收到此错误 java.text.ParseException: Unparseable date: "2017-03-09T18:30:00.000Z"【英文标题】:i am getting this error java.text.ParseException: Unparseable date: "2017-03-09T18:30:00.000Z" 【发布时间】:2017-05-31 06:43:55 【问题描述】:DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
String dateStr = "2017-03-09T18:30:00.000Z";
Date date = formatter.parse(dateStr);
System.out.println("here");
System.out.println(date);
【问题讨论】:
当然。注意图案中的闪光! 谢谢,我知道问题是缺少“Z”。 Z 应该用单引号作为 T 我建议你不要使用SimpleDateFormat
和Date
。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time API 的Instant
。查看答案。
【参考方案1】:
谢谢,我知道问题是缺少“Z”。 Z应该是单一的 引用为 T
不!不!不!
在模式中使用'Z'
将使Z
被视为字符文字而不是其预期含义。日期时间字符串中的Z
,2017-03-09T18:30:00.000Z
是零时区偏移量的timezone designator。它代表 Zulu 并指定 Etc/UTC
时区(时区偏移量为 +00:00
小时)。
此外,modern date-time API* 基于 ISO 8601 并且不需要明确使用 DateTimeFormatter
对象,只要日期时间字符串符合 ISO 8601 标准。
演示:
import java.time.Instant;
public class Main
public static void main(String[] args)
Instant instant = Instant.parse("2017-03-09T18:30:00.000Z");
System.out.println(instant);
输出:
2017-03-09T18:30:00Z
出于任何原因,如果您需要将此Instant
的对象转换为java.util.Date
的对象,您可以这样做:
Date date = Date.from(instant);
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。
使用旧版 API:
旧的日期时间 API(java.util
日期时间类型及其格式类型,SimpleDateFormat
)已过时且容易出错。建议完全停止使用它并切换到现代日期时间 API java.time
。为了完整起见,我在下面编写了一个使用旧版日期时间 API 的解决方案。
使用X
处理日期时间字符串中的Z
。查看documentation page 了解有关符号的更多信息。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class Main
public static void main(String[] args) throws ParseException
SimpleDateFormat sdf = new SimpleDateFormat("y-M-d'T'H:m:s.SSSX", Locale.ENGLISH);
Date date = sdf.parse("2017-03-09T18:30:00.000Z");
System.out.println(date);// Note: will display date-time in your local timezone
在我的时区输出:
Thu Mar 09 18:30:00 GMT 2017
注意java.util.Date
对象不是像modern date-time types 那样的真实日期时间对象;相反,它表示自称为“纪元”的标准基准时间以来的毫秒数,即January 1, 1970, 00:00:00 GMT
(或 UTC)。当你打印一个java.util.Date
的对象时,它的toString
方法返回JVM 时区中的日期时间,从这个毫秒值计算。如果您需要在不同的时区打印日期时间,则需要将时区设置为 SimpleDateFormat
并从中获取格式化字符串,例如
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println(sdf.format(date));
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
【讨论】:
以上是关于我收到此错误 java.text.ParseException: Unparseable date: "2017-03-09T18:30:00.000Z"的主要内容,如果未能解决你的问题,请参考以下文章