【问题标题】:Java Can't Parse UTC Date with SimpleDateFormatJava 无法使用 SimpleDateFormat 解析 UTC 日期
【发布时间】:2023-03-20 05:26:01
【问题描述】:

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

 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;
}

【问题讨论】:

  • 你的格式不对。
  • 您期望/希望代码实际做什么?
  • 返回一个有效的 Date 对象。
  • 也许这可以帮助你:[Parce UTC Date][1] [1]: stackoverflow.com/questions/6543174/…
  • 你为什么不用jodatime API? new Datetime.parse(date) 应该够了

标签: java datetime spring-mvc jodatime


【解决方案1】:

这个日期:

"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 来实际解析它。)

【讨论】:

    【解决方案2】:

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

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

    简单一班...
    (将标准字符串提供给 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
    

    【讨论】:

      【解决方案3】:

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

      通常我们在日期方面面临两个问题

      1. 将字符串解析为日期
      2. 以所需的字符串格式显示日期

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

      方法一: 将您的 UTC 字符串转换为 Instant。使用Instant,您可以通过提供时区字符串为任何时区创建日期,并使用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));
      

      方法二:

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

      yyyy-MM-dd'T'HH: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));
      

      方法三:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        • 1970-01-01
        相关资源
        最近更新 更多