您的代码可以在没有错误迹象的情况下编译,但会出现错误 java.lang.IllegalArgumentException: Cannot format given Object as a Date 当你跑的时候。这是因为 SimpleDateFormat 无法格式化joda时间 DateTime 对象。我们当然会期望在编译时报告这一点。但是除了 SimpleDateFormat.format(Date) 还有一个 format(Object) 继承自 Format . 它适用于格式化 Date 或者 Number (从新纪元开始的毫秒)。此方法是编译器在传递 DateTime . 这就是为什么没有编译时错误消息。 提示:当你不能立即理解错误信息时,请将其粘贴到搜索引擎中。它通常会给你一个解释和解决方案。在这种情况下也是如此。
2条答案
按热度按时间bnlyeluc1#
请尝试以下操作:
你必须转换
DateTime
到Date
格式化之前,请使用toDate()
方法就行了。的api
toDate()
和apiminusMonths
,我建议您检查新方法的apiyjghlzjz2#
java.time文件
刚才在我的电脑上运行时的输出:
2018-08-04t12:45:34.087966+01:00
time是现代的java日期和时间api,已经有效地取代了joda time。从主页:
请注意,joda time被认为是一个基本上“已完成”的项目。没有重大的增强计划。如果使用java se 8,请迁移到
java.time
(jsr-310)。在代码中,我利用了java.time类
toString
方法生成iso 8601格式,即您要求的格式。我发现秒上额外的小数不太可能带来任何问题,因为它们在标准之内是允许的。乔达时间
输出示例:
2018-08-04t12:50:36.071+02:00
new DateTime()
只有毫秒精度。你总是能得到精确的3位小数。我必须使用旧的java库,因为我在一家使用java版本<8的公司工作
java.time在Java6和Java7上也运行得很好,在所有条件相同的情况下,我推荐使用它而不是joda time。只有被迫使用Java5,joda time无疑是个不错的选择。
在Java8和更高版本以及更新的android设备上(api级别26),java.time是内置的。
在java6和java7中,得到了三个10的backport,即现代类的backport(对于jsr310是三个10;请参见底部的链接)。
在(旧的)android上使用android版本的threeten backport。它叫3TENABP。并确保从导入日期和时间类
org.threeten.bp
有分装的。你的代码哪里出错了?
您的代码可以在没有错误迹象的情况下编译,但会出现错误
java.lang.IllegalArgumentException: Cannot format given Object as a Date
当你跑的时候。这是因为SimpleDateFormat
无法格式化joda时间DateTime
对象。我们当然会期望在编译时报告这一点。但是除了SimpleDateFormat.format(Date)
还有一个format(Object)
继承自Format
. 它适用于格式化Date
或者Number
(从新纪元开始的毫秒)。此方法是编译器在传递DateTime
. 这就是为什么没有编译时错误消息。提示:当你不能立即理解错误信息时,请将其粘贴到搜索引擎中。它通常会给你一个解释和解决方案。在这种情况下也是如此。
链接
joda time主页
oracle教程:日期时间解释如何使用
java.time
.java规范请求(jsr)310,其中
java.time
第一次被描述。三十后港工程
java.time
到Java6和Java7(jsr-310为310)。threetenabp,android版threeten backport
问:如何在android项目中使用threetenabp,有非常透彻的解释。
维基百科文章:iso 8601
姐妹问题:java:无法将给定对象格式化为日期。