Java无法解析的日期

时间:2014-02-12 14:23:31

标签: java datetime

有以下代码:

Date st = new SimpleDateFormat("HH:mm").parse(date);

我得到以下异常“Unparseable date:”2000-01-01T01:00:00Z“(在偏移4处)”。我该如何解决?提前致谢。

7 个答案:

答案 0 :(得分:1)

TL;博士

Instant.parse( "2000-01-01T01:00:00Z" )

错误的解析模式

您定义了一种格式模式,表明您希望输入字符串为小时和分钟。但是你的输入字符串有更多,几年,几个月等等。

java.time

从Java 8及更高版本开始,新的java.time package取代了旧的java.util.Date/.Calendar和java.text.SimpleDateFormat。尽可能避免使用旧课程,因为它们已被证明是混乱,麻烦和有缺陷的。

您的输入字符串使用ISO 8601定义的标准日期时间格式之一。幸运的是,java.time默认使用该格式。

String input = "2000-01-01T01:00:00Z" ;
Instant instant = Instant.parse( input ) ;

Instant是时间轴上的一个时刻,基本上是UTC。您可以将值调整为特定时区(ZoneId),从而生成ZonedDateTime个对象。

ZonedId zoneId = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.of( instant , zoneId ) ;

如果您在ZonedDateTime上调用toString,您将获得如下字符串:

  

1999-12-31T20:00:00-05:00 [美国/蒙特利尔]

ZonedDateTime类通过在括号中附加时区名称来扩展ISO 8601格式。

答案 1 :(得分:0)

Date st = new SimpleDateFormat("HH:mm").parse(date.substring(11,16));

答案 2 :(得分:0)

请改用此格式:

Date st = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").parse(date);

答案 3 :(得分:0)

SimpleDateFormat非常无情。它希望您传递一个与您初始化它的格式字符串完全匹配的String。如果您传递“HH:mm”作为其格式字符串,它将无法处理任何其他格式 - 它无法处理其中包含一年的日期等。它将处理“3:56”(在这种情况下,您将于1970年1月1日上午03:56在你的Date中获得。

答案 4 :(得分:0)

试试这个

SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
Date date = dtf.parse(date);
dtf = new SimpleDateFormat("HH:mm");
String dateStr = dtf.format(date);
Date finalDate = dtf.parse(date);

希望它有所帮助。

答案 5 :(得分:0)

试试这个

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX")

答案 6 :(得分:-1)

异常中的日期是xml架构dateTime。请注意,只需创建

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

不会像您想象的那样完全正常工作,因为Z表示“UTC”时区,默认情况下解析器初始化为本地时间。

另请注意,架构dateTime具有变量定义,它可以(可选)具有毫秒精度(0或更多毫秒),时区(如果不是Z)与SimpleDateFormat的格式不兼容。

简而言之:使用默认库,xml日期时间很棘手。我已经编写了一个自定义解决方案来处理它们在我们的环境中,但你也可以查看joda时间库,我认为它可以很好地处理它们。或者您可以等待下一个具有新日期API的Java版本。