【问题标题】:How to solve java.text.ParseException: Unparseable date?如何解决 java.text.ParseException:无法解析的日期?
【发布时间】:2017-09-29 22:26:35
【问题描述】:

我正在尝试将其转换为可读格式,但请不断收到java.text.ParseException: Unparseable date: "2016-11-18T11:13:43.838Z" (at offset 23)

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US);
try {
    Date date1 = df.parse("2016-11-18T11:13:43.838Z");

    DateFormat outputFormatter1 = new SimpleDateFormat("dd-MMM-yyyy");
    String output1 = outputFormatter1.format(date1); //
} catch (ParseException e) {
    e.printStackTrace();
}

我阅读了有关添加区域设置的信息,如其他 SO 答案所建议的那样,但它仍然无法正常工作。

【问题讨论】:

  • SimpleDateFormat 中将 Z 放在单引号中。像这样:DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
  • 你错过了时区......
  • @ΦXocę웃Пepeúpaツ 他确实有一个时区。 Z 是零时区,相当于+0000

标签: java date date-format


【解决方案1】:

根据docs,格式字符串中的Z 表示RFC 822 时区,例如+01:00。您需要解析 ISO 8601 时区(输入字符串中的 Z 表示 UTC 时区)。你用X配置它:

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

【讨论】:

  • 您好,我尝试了 X,但得到“java.lang.IllegalArgumentException: Unknown pattern character 'X' at java.text.SimpleDateFormat.validatePatternCharacter(SimpleDateFormat.java:314)”。顺便说一句,我在 Android 应用程序中使用它,我只是意识到我们的 mongodb 上保存的模式在 android developer.android.com/reference/java/text/SimpleDateFormat.html 中不受支持
【解决方案2】:

您正在解析的字符串不是该模式的正确表示,您缺少 TimeZone... 类似于:-0600

示例:

Date date1 = df.parse("2016-11-18T11:13:43.838-0600Z");

这里是doc了解更多信息....

您的代码应如下所示:

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    try {
        Date date1 = df.parse("2016-11-18T11:13:43.838-0600Z");
        DateFormat outputFormatter1 = new SimpleDateFormat("dd-MMM-yyyy");
        String output1 = outputFormatter1.format(date1); //
    } catch (ParseException e) {
        e.printStackTrace();
    }

【讨论】:

  • 这是唯一有效的方法。解决方案是更改后端保存日期的方式,以便我可以通过 SimpleDateFormat 将其格式化为允许的模式。除非有人可以在不更改 api 调用返回的日期值的情况下提供解决方案,否则我认为这是最好的答案。
  • @Woppi -0600 与 Z (=+0000) 不同。因此,如果您通过字符串预处理更改输入,您将获得另一个结果。如果您的 JVM 太旧(在 Java-7 之前不支持 X 模式),那么您应该将“Z”替换为“+0000”(甚至是“+00:00”)。
【解决方案3】:

阅读SimpleDateFormat 的Javadoc,我发现使用Z 作为时区非常严格。它不会将"Z" 识别为zulu,它只接受数字时区偏移量。 您可能想改用X,它根据文档接受"Z"

【讨论】:

    【解决方案4】:

    请试试这个格式

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

    【讨论】:

    • 错误答案。要解析的字符串中的 Z 是 0 的 UTC 偏移量。如果忽略它,则不会得到正确的时间。
    • 是的,正确的解决方案herehere
    猜你喜欢
    • 2021-07-05
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多