This question already has answers here:
Java / convert ISO-8601 (2010-12-16T13:33:50.513852Z) to Date object
                                
                                    (4个答案)
                                
                        
                3年前关闭。
            
        

如何使用SimpleDateFormat将String转换为ISODate格式,这意味着我最终希望以java.util.Date格式获取Date。

我的字符串看起来像2017-02-17T09:28:03.000Z,我想将其转换为日期格式。我可以以Joda日期格式执行此操作,但是由于我使用的是mongoDB,因此它不接受joda格式。

   String startDateString1 =  "2017-02-17T04:23:17.452Z";
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    Date  startDate = df.parse(startDateString1);
    String newDateString = df.format(startDate);


上面的代码不起作用。

最佳答案

您的代码不起作用,因为Z是用于解释RFC-822时区的保留字符:


  RFC 822时区:对于格式设置,使用RFC 822 4位时区格式:

 RFC822TimeZone:
         Sign TwoDigitHours Minutes
 TwoDigitHours:
         Digit Digit



从Java 7开始,您可以使用X解释ISO-8601时区https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html。以下作品:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");


但是在我的电脑上

System.out.println(newDateString);


结果如下:


  2017-02-17T05:23:17.452 + 01


另外,如果您确定只有UTC日期,则可以使用简单的引号将Z字母转义:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");


这是显示的结果:


  2017-02-17T04:23:17.452Z

08-28 03:56