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

Convert a date of 6 months ago from now, into a String

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

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

但我得到了例外:

线程 "main" 中出现异常 java.lang.IllegalArgumentException:无法将给定对象格式化为日期

我做错了什么?

尝试以下操作:

String fromDateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sssX").format(new DateTime().minusMonths(6).toDate());

您必须在格式化之前将 DateTime 转换为 Date,使用 toDate() 方法即可。

API for toDate() and API 对于 minusMonths,我建议您检查 API 以获取新方法

java.time

    String fromDateTime = OffsetDateTime.now(ZoneId.systemDefault()).minusMonths(6).toString();
    System.out.println(fromDateTime);

刚才在我电脑上运行ning时的输出:

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

java.time 是现代 Java 日期和时间 API 并且有效地取代了 Joda-Time。来自主页:

Note that Joda-Time is considered to be a largely “finished” project. No major enhancements are planned. If using Java SE 8, please migrate to java.time (JSR-310).

在代码中,我利用 java.time 类' toString 方法生成 ISO 8601 格式,即您要求的格式。我发现秒上的额外小数不太可能造成任何问题,因为它们在标准中是允许的。

乔达时间

    String fromDateTime = new DateTime().minusMonths(6).toString();

示例输出:

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(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

你的代码出了什么问题?

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

提示:如果您不能立即理解错误消息,请将其粘贴到您的搜索引擎中。它通常会引导您找到解释和解决方案。同样在这种情况下。

链接