Java不可解析日期
有以下代码:Java不可解析日期,java,datetime,Java,Datetime,有以下代码: Date st = new SimpleDateFormat("HH:mm").parse(date); 我得到了以下异常“不可解析的日期:”2000-01-01T01:00:00Z(在偏移量4处)。我怎样才能修好它?提前谢谢 改用此格式: Date st = new SimpleDateFormat("HH:mm").parse(date.substring(11,16)); Date st = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm
Date st = new SimpleDateFormat("HH:mm").parse(date);
我得到了以下异常“不可解析的日期:”2000-01-01T01:00:00Z(在偏移量4处)。我怎样才能修好它?提前谢谢 改用此格式:
Date st = new SimpleDateFormat("HH:mm").parse(date.substring(11,16));
Date st = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").parse(date);
SimpleDateFormat
是非常无情的。它希望您传递一个与初始化它时使用的格式字符串完全匹配的字符串。如果您将“HH:mm”作为其格式字符串传递,它将无法处理任何其他格式-它无法处理包含年份的日期,等等。它将处理“3:56”(在这种情况下,您将在日期中获得1970年1月1日凌晨3:56的日期)。试试这个
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);
希望有帮助。试试这个
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX")
异常中的日期是xml架构dateTime。请注意,只需创建
SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
不会完全像您所想的那样工作,因为Z表示“UTC”时区,并且解析器默认初始化为本地时间
还要注意,模式dateTime有一个变量定义,它可以(可选)具有毫秒精度(0或更多毫秒),并且时区(如果不是Z)与SimpleDataFormat格式不兼容
简而言之:xml日期时间对于默认库来说很棘手。我已经为在我们的环境中处理它们编写了一个自定义解决方案,但是您也可以查看joda time library,我相信它可以很好地处理它们。或者您可以等待下一个java版本,该版本将有一个新的日期API。tl;博士
错误的解析模式
您定义了一个格式化模式,表示您希望输入字符串为小时和分钟。但是您的输入字符串有更多的、年、月等等
java.time
从Java8及更高版本开始,旧的Java.util.Date/.Calendar和Java.text.SimpleDataFormat已被新的替代。尽可能避免使用旧类,因为它们已经被证明是令人困惑的、麻烦的和有缺陷的
您的输入字符串使用由定义的标准日期时间格式之一。幸运的是,java.time默认使用这种格式
String input = "2000-01-01T01:00:00Z" ;
Instant instant = Instant.parse( input ) ;
a是时间线上的一个时刻,基本上是在。您可以将该值调整为特定时区(a),从而生成一个对象
如果在ZoneDateTime上调用toString
,将得到如下字符串:
1999-12-31T20:00:00-05:00[美国/蒙特利尔]
ZonedDateTime类通过在括号中添加时区名称来扩展ISO 8601格式。通过传入一个格式为“HH:mm”的字符串来实现。请参见。。答案就在那里。什么值有日期变量?这个答案不正确。在Z
周围加上单引号会导致在解析过程中忽略该字母。但那是至关重要的信息!Z
代表“Zulu”,表示日期时间值在时区内,与UTC的偏移量为00:00
。单引号表示您正在丢失信息。此外,如果传入字符串具有偏移量编号,例如+05:30
,而不是Z
,则解析将失败,因为单引号意味着您希望在所有输入中只显示一个字母“Z”。答案不是不正确的,您只是看错了。Z确实是重要信息(如我所述,它表示UTC时区)。事实上,它被引用忽略了,这对于那些知道这门课的人来说应该是不言而喻的,这就是为什么我说你必须小心,因为它将使用当地时间。
String input = "2000-01-01T01:00:00Z" ;
Instant instant = Instant.parse( input ) ;
ZonedId zoneId = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.of( instant , zoneId ) ;