2014-02-12 115 views
-1

有下面的代码:Java的无法解析的日期

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

我也得到了以下异常 “无法解析的日期: ”2000-01-01T01:00:00Z“(偏移量为4)”。我该如何解决它?提前致谢。

+3

通过传递形式为“HH:mm”的字符串? –

+0

看到[docs](http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)..答案就在那里。 – Maroun

+1

Whaat值有日期变量吗? –

回答

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

使用这种格式来代替:

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

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

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

希望它能帮助。

0

试试这个

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

异常中的日期是XML模式日期时间。需要注意的是,只需要创建像你想象的,因为Z表示“UTC”时区和解析器是默认初始化为本地时间

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

不会完全工作。

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

简而言之:xml日期时间对于默认库非常棘手。我已经编写了一个自定义解决方案来处理它们在我们的环境中,但你也可以看看我相信处理它们的joda时间库。或者你可以等待下一个java版本,它将有一个新的日期API。

+0

**这个答案是不正确的。**围绕'Z'放置单引号会导致字母在解析过程中被忽略。但那'Z'是重要的信息! “Z”代表“Zulu”,并表示日期时间值在[UTC](https://en.wikipedia.org/wiki/Coordinated_Universal_Time)时区中,从00:00开始偏移“00:00”世界标准时间。单引号意味着你正在丢失信息。此外,如果一个传入的字符串有一个偏移号码,例如“+05:30”而不是“Z”,那么解析将会失败,因为单引号表示您期望在所有输入中出现一个字母“Z” 。 –

+0

答案并不正确,你只是读错了。 Z确实是重要的信息(正如我所说的,它表示UTC时区)。被引用忽略的事实对于那些了解班级的人来说应该是不言而喻的,这就是为什么我说你必须小心,因为它会利用当地时间。 – nablex

1

TL;博士

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

错误解析模式

您定义的,说你所期望的输入字符串是小时和分钟的格式设置模式。但是你的输入字符串有更多,几年,几个月等等。

java.time

从Java 8中和后,老java.util.Date/.Calendar和java.text.SimpleDateFormat中已经被新的取代java.time package。尽可能避免旧的课程,因为它们被证明是令人困惑,麻烦和有缺陷的。

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

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

一个InstantUTC基本上在时间轴上一会儿。您可以将该值调整到特定的时区(a 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格式。