有以下代码:
Date st = new SimpleDateFormat("HH:mm").parse(date);
我得到以下异常“Unparseable date:”2000-01-01T01:00:00Z“(在偏移4处)”。我该如何解决?提前致谢。
答案 0 :(得分:1)
Instant.parse( "2000-01-01T01:00:00Z" )
您定义了一种格式模式,表明您希望输入字符串为小时和分钟。但是你的输入字符串有更多,几年,几个月等等。
从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版本。