我收到此错误 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 我建议你不要使用SimpleDateFormatDate。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time API 的Instant。查看答案。 【参考方案1】:

谢谢,我知道问题是缺少“Z”。 Z应该是单一的 引用为 T

不!不!不!

在模式中使用'Z' 将使Z 被视为字符文字而不是其预期含义。日期时间字符串中的Z2017-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"的主要内容,如果未能解决你的问题,请参考以下文章

我收到此错误 NSURLErrorDomain 错误 -999

为啥我会收到此错误:“不支持此功能(数字商品)。”?

为啥我在 django 教程中收到此模板错误?

为啥我收到此错误? KeyError:“没有”

SimpleSAML 配置错误,收到此错误。可能是啥问题?

我收到此错误:“实体类型 'DisplayFormatAttribute' 需要定义主键。”