从现在开始转换6个月前的日期,为String

问题描述 投票:0回答:2

我已经采取了所有的特种部队和其他网站给出的答案,并试图做到这一点:

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

但我报错例外:

异常在线程“主” java.lang.IllegalArgumentException异常:无法格式化给定对象的日期

我究竟做错了什么?

java date format jodatime simpledateformat
2个回答
5
投票

java.time

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

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

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

java.time是现代Java的日期和时间API和已经有效地替换乔达时间。从主页:

需要注意的是乔达时间被认为是在很大程度上“已完成”的项目。没有大的改进计划。如果使用Java SE 8,请迁移到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过了,所有的事情都是平等的,我建议过来乔达时间。只有被迫使用Java 5,乔达时间无疑是不错的选择。

  • 在Java 8和更高版本以及较新的Android设备(从API级别26)java.time来自内置。
  • 在Java 6和7得到ThreeTen反向移植,现代类的反向移植(ThreeTen对JSR 310;看到底部的链接)。
  • 在(以上)的Android使用ThreeTen反向移植了Android版本。这就是所谓的ThreeTenABP。并确保您从org.threeten.bp导入的日期和时间班,子包。

出了什么错在你的代码?

您的代码可以在没有错误的迹象进行编译,但在运行时发出java.lang.IllegalArgumentException: Cannot format given Object as a Date。这是因为SimpleDateFormat无法格式化乔达时间DateTime对象。我们当然都希望这是在编译时的报道。但除了SimpleDateFormat.format(Date)还有来自format(Object)继承一个覆盖Format。它适用于格式化无论是Date或(自纪元以来的毫秒)Number。这种方法是,当你传递一个DateTime编译器选择的一个。这就是为什么没有编译时错误消息。

提示:当您不能立刻理解的错误信息,将其粘贴到您的搜索引擎。它会经常导致你的解释和解决方案。在这种情况下。

链接


1
投票

尝试以下方法:

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

你必须在DateTime转换为Date格式化之前,使用toDate()方法将做的工作。

APItoDate()APIminusMonths,我会建议您检查新方法的API

© www.soinside.com 2019 - 2024. All rights reserved.