Java SimpleDateFormat:模式 - ParseException [重复]
Posted
技术标签:
【中文标题】Java SimpleDateFormat:模式 - ParseException [重复]【英文标题】:Java SimpleDateFormat: Pattern - ParseException [duplicate] 【发布时间】:2017-12-21 13:53:44 【问题描述】:我正在为一个日期字符串而苦苦挣扎,我需要解析成 java 的“日期”对象。 这是我到目前为止所得到的:
try
String value = "2017-11-23T14:00:49.184000000Z";
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'";
SimpleDateFormat parser = new SimpleDateFormat(pattern);
Date date = parser.parse(value);
catch (ParseException e) e.printStackTrace();
它目前抛出一个 ParseException “Unparseable date”,我无法让它工作。
非常感谢任何帮助!
谢谢
【问题讨论】:
只有999
毫秒,所以你想添加纳秒是行不通的。您应该查看新的java.time
包,并更喜欢DateTimeFormatter
。
是的,Elliot 是对的,184000 毫秒(在 int 范围内)可能有效,但会增加日期的秒数、分钟数、小时数。
在您的值中,年份和第一个连字符之间有一个从左到右的不可见标记(Unicode 8206 或十六进制 200E)。这可以防止解析。字符串中总共有四个,每个连字符前一个,每个连字符后一个。幸运的是,您将它们粘贴到您的问题中,以便我们检测到它们!
很抱歉,链接问题的答案也无法处理您字符串中的控制字符。
@BasilBourque,它确实看起来那样。但是,ISO 8601 标准不包括在导致异常的问题的字符串中发现的不可见控制字符。 OP 需要摆脱这些,然后将受益于使用现代类。
【参考方案1】:
改用 java.time
包 (java 8) 中的 Instant
,它应该如下所示
String value = "2017-11-23T14:00:49.184000000Z";
Instant instant = Instant.parse(value);
Date date = Date.from(instant);
System.out.println(date);
【讨论】:
感谢您的解决方案,它按预期工作。但是我仍然很难让它工作。作为@Ole V.V.已经指出,我的传入值字符串中有一些不可见的 uft-8 字符,这混淆了解析。【参考方案2】:您也可以像这样使用 timeZone 作为另一种解决方案。
TimeZone tz = TimeZone.getTimeZone("Asia/Calcutta");
Calendar cal = Calendar.getInstance(tz);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'");
sdf.setCalendar(cal);
cal.setTime(sdf.parse("2017-11-23T14:58:00.184000000Z"));
Date date = cal.getTime();
System.out.println(date);
【讨论】:
也不行,抱歉。 我试过这个对我来说很好。 预期结果(因为我在一年中的这个时候在 UTC+1):2017 年 11 月 23 日星期四 15:58:00 CET。观察结果:2017 年 11 月 25 日星期六 13:34:40 CET。休息两天。你会得到哪个结果? 我认为时区有问题。使用您的时区代替“亚洲/加尔各答” 这里使用的麻烦类现在是遗留的,完全被行业领先的 java.time 类所取代。以上是关于Java SimpleDateFormat:模式 - ParseException [重复]的主要内容,如果未能解决你的问题,请参考以下文章
类DateFormat(子类SimpleDateFormat)