[英]Java Unparsable date
我有一个格式如下的String dateString = "2014-03-17T20:05:49.2300963Z"
: String dateString = "2014-03-17T20:05:49.2300963Z"
试试这个:
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'kk:mm:ss.SSSX");
Date date = df.parse(dateString);
导致不可Unparsable date
除外。
docs: http : //docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html表示当TimeZone使用单个字母时, ISO 8601
与X
一起使用。
编辑重新阅读文档后,我稍微切换了SimpleDateFormat
:
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
dateString = dateString.replace("Z", "");
我拿出Z
是因为我知道时区,使用H
而不是k
并为傻笑添加更多S
现在时间正在解析,但是不正确。 日期是准确的,时间似乎是随机的。
编辑2问题是Java只允许毫秒精度,因此2300963
被解释为2300秒和963毫秒。 我需要对字符串进行一些不同的格式化才能使其正常工作。
编辑3事实证明,在Java中,您不可能有几分之一秒的时间。 它必须被截断为毫秒。 我最终使用了数据库可以使用的类型,但是一般的解决方案是将秒的小数部分截断为毫秒。 我将发布示例代码作为答案。
您需要在String
日期中提供尽可能多的S
在这种情况下,7
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'kk:mm:ss.SSSSSSSX");
这是必需的,因为否则, DateFormat
不知道毫秒在哪里结束以及时区在哪里开始。
另请注意,
2300963
毫秒值表示2300秒和963毫秒。 为什么这样呢? 为什么这些秒数不属于相应位置的值? 当DateFormat
解析时,将添加它们。
这有效: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'kk:mm:ss.SSSSSSS'Z'");
S
X
将解析一个时区-0800
。 因此,您的字符串必须看起来像2014-03-17T20:05:49.2300963-0800
(或类似名称)。 将Z
视为文字,如T
编辑 : 与您的部分秒数问题有关 。
如何将小数秒截断为毫秒(因为Java无法处理小数秒):
public String truncate(String dateString){
int numberOfDigits = dateString.substring(dateString.indexOf("."), dateString.length() - 1).length();
String justMilliSecondsDate = null;
if (numberOfDigits == 3) {
justMicrosDate = dateString;
}
else if (numberOfDigits > 3) {
justMilliSecondsDate = dateString.substring(0, dateString.length() - numberOfDigits + 3);
}
else {
justMilliSecondsDate = dateString;
for (int i = numberOfDigits ; i < 3 ; i++) justMilliSecondsDate += "0";
}
return justMilliSecondsDate;
}
Instant.parse( "2014-03-17T20:05:49.2300963Z" )
您正在使用麻烦的旧日期时间类(现在已遗留),由java.time类取代。
ISO 8601标准定义了表示日期时间值的字符串格式。 您输入的符合ISO 8601。
解析和生成字符串时,java.time类默认使用ISO 8601格式。 因此,无需指定格式化模式。
Instant instant =
Instant.parse( "2014-03-17T20:05:49.2300963Z" );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.