将现在6个月前的日期转换为字符串

Mar*_*rco 0 java format date jodatime simpledateformat

我已经采取了SOF和其他网站上给出的所有答案,并尝试这样做:

String fromDateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sssX").format(new DateTime().plusMonths(-6));
Run Code Online (Sandbox Code Playgroud)

但是我被给了例外:

线程"main"中的异常java.lang.IllegalArgumentException:无法将给定的Object格式化为Date

我究竟做错了什么?

Ole*_*.V. 5

java.time

    String fromDateTime = OffsetDateTime.now(ZoneId.systemDefault()).minusMonths(6).toString();
    System.out.println(fromDateTime);
Run Code Online (Sandbox Code Playgroud)

刚刚在我的计算机上运行时的输出:

2018-08-04T12:45:34.087966 + 01:00

java.time是现代Java日期和时间API,已经有效地取代了Joda-Time.从主页:

请注意,Joda-Time被认为是一个很大程度上"完成"的项目.没有计划重大改进.如果使用Java SE 8,请迁移到java.time(JSR-310).

在代码中,我利用了java.time类的toString方法生成ISO 8601格式这一事实,即您要求的格式.我发现秒上的额外小数不太可能造成任何问题,因为在标准范围内允许这样做.

乔达时间

    String fromDateTime = new DateTime().minusMonths(6).toString();
Run Code Online (Sandbox Code Playgroud)

示例输出:

2018-08-04T12:50:36.071 + 02:00

new DateTime()只有毫秒精度.您将始终在秒上获得正好3位小数.

我必须使用旧的java库,因为我在一个使用java版本<8的公司工作

java.time也适用于Java 6和7,并且在所有条件相同的情况下我推荐Joda-Time.只有被迫使用Java 5,Joda-Time无疑是不错的选择.

  • 在Java 8及更高版本和更新的Android设备上(来自API级别26),java.time内置.
  • 在Java 6和7中获取ThreeTen Backport,现代类的后端(JST 310的ThreeTen;请参见底部的链接).
  • 在(较旧的)Android上使用Android版的ThreeTen Backport.它被称为ThreeTenABP.并确保从org.threeten.bp子包中导入日期和时间类.

您的代码出了什么问题?

您的代码可以在没有错误迹象的情况下编译,但java.lang.IllegalArgumentException: Cannot format given Object as a Date在运行时会发出.这是因为SimpleDateFormat无法格式化Joda-Time DateTime对象.我们当然希望在编译时报告这一点.但除此之外SimpleDateFormat.format(Date)还有一个被重写的format(Object)继承自Format.它适用于格式化a Date或a Number(自纪元以来的毫秒).这个方法是编译器在传递时选择的方法DateTime.这就是没有编译时错误消息的原因.

提示:如果您没有立即了解错误消息,请将其粘贴到搜索引擎中.它经常会引导您解释和解决方案.也是在这种情况下.

链接