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

Java 将从现在起6个月前的日期转换为字符串,java,date,format,jodatime,simpledateformat,Java,Date,Format,Jodatime,Simpledateformat,我已经在SOF和其他网站上给出了所有答案,并尝试这样做: String fromDateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sssX").format(new DateTime().plusMonths(-6)); 但我有个例外: 主线程java.lang.IllegalArgumentException中出现异常:无法将给定对象格式化为日期 我做错了什么?请尝试以下操作: String fromDateTime = new S

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

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

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

我做错了什么?

请尝试以下操作:

String fromDateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sssX").format(new DateTime().minusMonths(6).toDate());
您必须在格式化之前将日期时间转换为日期,使用toDate方法即可完成此工作

对于今天和接下来的几个月,我建议您检查API中的新方法

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

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

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

请注意,Joda Time被认为是一个基本上已“完成”的项目。 没有计划进行重大改进。如果使用JavaSE8,请迁移 到java.time JSR-310

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

乔达时间 示例输出:

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

新的日期时间只有毫秒精度。你总是能在秒数上得到精确的3位小数

我必须使用旧的java库,因为我在一家使用java版本<8的公司工作 time在Java6和Java7上也能很好地工作,在所有条件相同的情况下,我推荐它而不是Joda time。只有在被迫使用Java5的情况下,Joda Time无疑是一个不错的选择

在Java8和更高版本以及API级别为26的较新Android设备上,Java.time内置。 在Java6和Java7中,获取ThreeTen Backport,即JSR310的现代类ThreeTen的Backport;请参阅底部的链接。 在较旧的Android上,使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。 你的代码出了什么问题? 您的代码可以在没有错误迹象的情况下编译,但会发出java.lang.IllegalArgumentException:无法在运行时将给定对象格式化为日期。这是因为SimpleDataFormat无法格式化Joda Time DateTime对象。我们当然会期望在编译时报告这一点。但除了SimpleDataFormat.formatDate之外,还有一个从Format继承的重写formatObject。它用于格式化日期或自历元起的毫秒数。此方法是编译器在传递日期时间时选择的方法。这就是为什么没有编译时错误消息

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

链接 解释如何使用java.time。 ,其中首次描述了java.time。 ,java.time的后端口到JSR-310的Java6和Java7。 ,Android版Three Ten Backport ,解释得非常透彻。 .
你用的是什么DateTime类?用的是Joda Time?然后坚持使用它,使用它的格式化程序,而不是SimpledTeformat,这是出了名的麻烦,Joda Time已经有了替代品。或者跳过这两个并完全使用。或者使用新的java日期时间类:ZonedDateTime.now.minusMonths6.toString。@Arnaud这确实是个问题。一个托德使它正确。实际的问题是我没有任何编译错误。有点奇怪,因为Date和DateTime多态性之间没有联系。我想知道为什么它不能给我任何提示甚至错误。@Marco Date和DateTime来自无关的框架,所以没有多态关系。恰恰相反,第二个显然来自Joda时代,旨在取代第一个,而不是补充。Joda Time的创建者继续创建它的继承者JSR 310和java 8及更高版本中内置的java.Time类。因此,没有理由再去碰那些糟糕的日期、日历和SimpleDateFormat类。仅使用java.time包中的类。将起作用,但不是推荐的方式。你正在从好的图书馆乔达时间进入坏的一个日期和简化的格式。这确实解决了我的问题。但我想知道:你谈论好的和坏的图书馆。关键是,如果我最终能让事情顺利进行?对于某些场景,您可能会遇到使用多个库的不兼容问题、错误转换等…@ngueno是的,您是对的,但在我的场景中,我看不到任何问题:p感谢大家的约会时间!你应该考虑改写格式化程序,它是线程安全的,在JoDA打包程序中是可用的,在所有方面都不能更具体。谢谢你,你真的教会了我很多!你应该得到绿色支票。
    String fromDateTime = OffsetDateTime.now(ZoneId.systemDefault()).minusMonths(6).toString();
    System.out.println(fromDateTime);
    String fromDateTime = new DateTime().minusMonths(6).toString();