【发布时间】:2014-03-17 20:25:05
【问题描述】:
我有一个格式为: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 中不能有秒的小数部分。它必须被截断到毫秒。我最终使用了我的数据库提供给我的类型,但一般的解决方案是将秒的小数部分截断为毫秒。我将发布如何做到这一点的示例代码作为答案。
【问题讨论】:
-
来自文档: 数字:对于格式化,模式字母的数量是最小的位数,较短的数字被零填充到这个数量。解析时,除非需要分隔两个相邻字段,否则忽略模式字母的数量。
-
For parsing, the number of pattern letters is ignored unless it's needed to separate two adjacent fields.您需要将毫秒与时区分开。 -
请注意,
2300963是一种奇怪的毫秒数。2300将添加为分钟和秒 AFAIK。 -
@fge
Hour in day (1-24)
标签: java parsing date simpledateformat