9

我正在尝试解析日期时间字符串,SimpleDateFormat.parse()但我不断收到无法解析的日期异常。

这是我要解析的日期格式:2011-10-06T12:00:00-08:00

这是我正在使用的代码:

try {
    String dateStr = "2011-10-06T12:00:00-08:00";
    SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    SimpleDateFormat dateFormatter = new SimpleDateFormat("MMM d, yyyy");
    Date date = dateParser.parse(dateStr);
    System.out.println(dateFormatter.format(date));         
} catch(Exception e) {
    System.out.println(e.getMessage());
}

返回此错误:java.text.ParseException: Unparseable date: "2011-10-06T12:00:00-08:00"

据我所知,这是使用 SimpleDateFormat 类的正确方法,但我不精通 Java,所以我可能会弄错。有谁知道我的问题是什么?

4

8 回答 8

17

时区应该是 GMT-08:00 或 -0800(正如 Madcore Tom 所说)。请参阅Java 文档

在 Java 7 中,您可以使用“yyyy-MM-dd'T'HH:mm:ssX”

于 2011-10-07T00:06:43.663 回答
15

我相信 SimpleDateFormat 不会解析带有冒号的时区(-08:00)。它应该能够解析日期2011-10-06T12:00:00-0800

一些简单的字符串操作应该可以帮助您摆脱冒号。

于 2011-10-06T23:58:51.653 回答
1

您首先需要将值格式化为"2011-10-06T12: 00: 00-08: 00".

Example: SimpleDateFormat dateParser = new SimpleDateFormat ("yyyy-MM-dd'T'HH: mm: ssZ");

之后,为所需的格式操作创建格式。前任:SimpleDateFormat fmt = new SimpleDateFormat ("dd / MM / yyyy HH: mm: ss");

并在解析日期之后。例如:Date date = dateParser.parse (dateFormat); 并打印格式化的日期。

下面,一个完整的例子。

String dataStr = "2011-10-06T12: 00: 00-08: 00";
SimpleDateFormat dataParser = new SimpleDateFormat ("dd / MM / yyyy HH: mm: ss", Locale.US);
Date date;
Try {
date = dataParser.parse (dataStr);
System.out.println (dateFormatter.format (date));

} cath (ParseException e) {

}
于 2017-09-18T20:47:03.183 回答
1
于 2018-02-03T05:31:24.057 回答
0

尝试

SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
于 2011-10-06T23:58:03.247 回答
0

对于像这样的日期格式2013-06-28T00:00:00+00:00,这段代码应该可以工作:

SimpleDateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
于 2013-06-13T09:29:05.020 回答
0

我相信你们中的大多数人都对 SimpleDateFormat 无法处理 ISO8601 格式感到沮丧。这是我解决这个麻烦的小技巧。

创建一个您知道将用于您的应用程序的 Know 格式列表,并将 SimpleDateFormat 应用于该列表。现在,在您的 formatDate() 方法中,简单地尝试所有已知格式并捕获异常,然后如果仍然没有日期,只需使用

Date d = javax.xml.bind.DatatypeConverter.parseDateTime("2013-06-28T00:00:00+00:00").getTime();
if (d == null)
try {
    SimpleDateFormater ...
}

尝试一下,看看是否有效。更多信息在 Java 中使用时区转换日期格式的简单技巧!

于 2014-02-27T06:26:12.467 回答
-1

我强烈建议将JodaTime用于此类事情。

您正在尝试解析 ISO 日期格式,而 Joda 是“开箱即用”的,并且还会为您带来很多其他好处。

我很久以前就放弃了尝试让标准 JDK 数据类来做有用的事情。

于 2011-10-07T00:13:22.293 回答