我有一个格式为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
例句中的结果。
文档:http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html表示当单个字母用于TimeZone时X
与ISO 8601
一起使用。
修改
重新阅读文档,我已经开始了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中不可能只有一小部分时间。它必须被截断为毫秒。我最终使用了我的数据库提供给我的类型,但一般的解决方案是将秒的小数部分截断为毫秒。我将发布如何做到这一点的示例代码作为答案。
答案 0 :(得分:4)
您需要提供与日期S
中一样多的String
。在这种情况下,7
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'kk:mm:ss.SSSSSSSX");
这是必需的,因为否则DateFormat
不知道毫秒结束的位置以及时区的开始位置。
另请注意,
2300963
作为毫秒值意味着2300秒和963毫秒。你为什么这么做?为什么那些秒数不是它们相应位置的值的一部分?当DateFormat
解析它时,它们将被添加。
答案 1 :(得分:1)
这有效: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
。答案 2 :(得分:0)
如何将小数秒截断为毫秒(因为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;
}
答案 3 :(得分:0)
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" );