Java中的DateFormatter

时间:2018-09-14 13:23:54

标签: java string date simpledateformat dateformatter

我正在使用以下代码格式化毫秒分辨率的日期字符串。它适用于2018-09-14T13:05:21.329Z,但不适用于2018-09-14T13:05:21.3Z。有人可以提出原因以及如何纠正吗?

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
SimpleDateFormat sdfDestination = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
    Date parsedDate = formatter.parse(date);
    String destDate = sdfDestination.format(parsedDate);
    return destDate;
} catch (java.text.ParseException parseException) {
    logger.error("Parse Exception occured while converting publication time to date "
            + "format 'yyyy-MM-dd HH:mm:ss'", parseException);
}

我得到以下例外:

java.text.ParseException: Unparseable date: "2018-09-14T13:05:21.3Z"
    at java.text.DateFormat.parse(Unknown Source) ~[na:1.8.0_181]
    at com.noordpool.api.implementation.utility.Utility.parseDate(Utility.java:136) [classes/:na]
    at com.noordpool.api.implementation.utility.Utility.parseMessage(Utility.java:77) [classes/:na]

2 个答案:

答案 0 :(得分:1)

您唯一的问题是您为SimpleDateFormat使用了错误的模式,需要进行以下更改:

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

收件人:

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

由于Z字符串中使用的date表示“零时偏移”,因此您只需在模式中将其作为'Z'传递即可。

这是 a working demo ,具有正确的模式。

编辑:

要使事情适用于不同的语言环境和时区,在创建Locale实例时需要使用适当的SimpleDateFormat,代码应该是这样的:

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

答案 1 :(得分:1)

java.time

    DateTimeFormatter dtfDestination
            = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    String date = "2018-09-14T13:05:21.3Z";
    String destDate = Instant.parse(date)
            .atZone(ZoneId.of("Indian/Comoro"))
            .format(dtfDestination);
    System.out.println(destDate);

此代码段的输出为:

  

2018-09-14 16:05:21

如果不是印度/科摩罗,请替换您的正确时区,因为正确的输出取决于使用正确的时区。如果要使用JVM的默认时区,请指定ZoneId.systemDefault(),但要注意,可以随时从程序的其他部分或在同一JVM中运行的其他程序更改默认值。

我正在利用这样一个事实:您的字符串"2018-09-14T13:05:21.3Z"采用ISO 8601格式,该格式是java.time类将其解析为默认值的格式,即没有任何显式格式化程序。 Instant.parse接受秒中从0到9个小数的任何内容,因此像您一样,给它一个仅包含1个小数的字符串没有问题。相比之下,老式的SimpleDateFormat不可能以秒为单位精确地解析秒上的十进制数,因为它将模式字母(大写)S表示为毫秒,所以.3将解析为3毫秒,而不是十分之三秒。

Jahnavi Paliwal已经正确诊断并解释了出现异常的原因。

您使用的日期时间类DateFormatSimpleDateFormatDate早已过时,尤其是SimpleDateFormat非常麻烦。由于您似乎正在使用Java 8(即使您没有使用Java 8),因此我建议您完全避免使用这些类,而改用java.time。

链接