Java无法使用SimpleDateFormat解析UTC日期

时间:2014-01-09 17:23:29

标签: java datetime spring-mvc jodatime

为什么我在下面收到错误?它只发生在一些日期。

 Helper.getDate("2014-01-09T17:10:14Z", "dd-MM-yyyy");

public static Date getDate(String date, String format) {
    DateFormat df = new SimpleDateFormat(format);

    try {
        return df.parse(date);
    } catch (ParseException e) {
        log.error("getDate", e);
    }

    return null;
}

3 个答案:

答案 0 :(得分:4)

这个日期:

"2014-01-09T17:10:14Z"

的格式为 "yyyy-MM-dd'T'HH:mm:ss'Z'"

(或在Java 7中"yyyy-MM-dd'T'HH:mm:ssX"

当然,用格式dd-MM-yyyy解析它是不可能的。

格式化字符串需要与输入兼容!

(注意我给了一个文字Z,这是后向兼容的.Java 7实际上理解ISO8601,你可以使用X来实际解析它。)

答案 1 :(得分:0)

该字符串2014-01-09T17:10:14Z是日期时间的标准ISO 8601格式。

Joda-Time 2.3库直接在其DateTime构造函数中使用此类标准字符串。无需格式化程序/解析器。

Easy one liner ...
(将标准字符串提供给DateTime的构造函数,然后将DateTime实例转换为java.util.Date实例)

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;

java.util.Date date = new DateTime( "2014-01-09T17:10:14Z" ).toDate();

转储到控制台,并显示DateTime值以进行比较......

System.out.println( "date: " + date );
System.out.println( "dateTime: " + new DateTime( "2014-01-09T17:10:14Z" ) );
System.out.println( "dateTime in UTC: " + new DateTime( "2014-01-09T17:10:14Z" ).toDateTime( DateTimeZone.UTC ) );

跑步时......

date: Thu Jan 09 09:10:14 PST 2014
dateTime: 2014-01-09T09:10:14.000-08:00
dateTime in UTC: 2014-01-09T17:10:14.000Z

答案 2 :(得分:0)

已经有很多答案,但只是想用 java 8 进行更新。

一般来说,我们面临两个日期问题

  1. 解析字符串到日期
  2. 以所需的字符串格式显示日期
  3. Java 8中的

    DateTimeFormatter类可用于这两个目的。 下面的方法试图为这些问题提供解决方案。

    方法1: 将您的UTC字符串转换为即时。使用即时,您可以通过提供时区字符串为所有时区创建日期,并使用DateTimeFormatter格式化日期以供显示。

    String dateString = "2016-07-13T18:08:50.118Z";
    String tz = "America/Mexico_City";
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMM d yyyy hh:mm a");
    ZoneId zoneId = ZoneId.of(tz);
    
    Instant instant = Instant.parse(dateString);
    
    ZonedDateTime dateTimeInTz =ZonedDateTime.ofInstant(instant, zoneId);
    System.out.println(dateTimeInTz.format(dtf));
    

    方法2:

    使用DateTimeFormatter内置常量(例如ISO_INSTANT)将字符串解析为LocalDateISO_INSTANT可以解析模式的日期

    yyyy-MM-dd' H&H:mm:ssX 例如' 2011-12-03T10:15:30Z'

    LocalDate parsedDate
      = LocalDate.parse(dateString, DateTimeFormatter.ISO_INSTANT);
    
    DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern("yyyy MM dd");
    System.out.println(parsedDate.format(displayFormatter));
    

    方法3:

    如果您的日期字符串具有很高的时间精度,例如它可以捕获几分之一秒,并且在这种情况下 2016-07-13T18:08:50.118Z 那么方法1将起作用,但方法2将不行。如果你试图解析它将抛出DateTimeException,因为ISO_INSTANT格式化程序将无法解析从其模式中看到的秒数。 在这种情况下,您必须通过提供如下日期模式来创建自定义 DateTimeFormatter

    LocalDate localDate 
    = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX"));