当前位置: 首页 > 知识库问答 >
问题:

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

顾乐池
2023-03-14

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

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

但我有个例外:

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

我做错了什么?

共有1个答案

田成仁
2023-03-14
    String fromDateTime = Offhtml" target="_blank">setDateTime.now(ZoneId.systemDefault()).minusMonths(6).toString();
    System.out.println(fromDateTime);

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

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

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

注意,Joda-Time被认为是一个基本“完成”的项目。没有计划进行重大增强。如果使用Java SE8,请迁移到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.time在Java 6和7上也能很好地工作,在所有条件相同的情况下,我推荐它而不是Joda-time。只有在被迫使用Java 5的情况下,Joda-Time无疑是个不错的选择。

  • 在Java 8及更高版本和更新的Android设备上(从API级别26开始)内置Java.time。
  • 在Java 6和7中获得ThreeTen后端口,即现代类的后端口(ThreeTen代表JSR 310;参见底部的链接)。
  • 在(较旧的)Android上使用Android版的ThreeTen Backport。这叫三次血压。并确保使用子包从org.threeten.bp导入日期和时间类。

您的代码可以在没有错误迹象的情况下进行编译,但在运行时会发出java.lang.IllegalArgumentException:无法将给定对象格式化为日期。这是因为SimpleDateFormat无法格式化Joda-TimeDateTime对象。我们当然希望在编译时报告这一点。但是,除了SimpleDateFormat.Format(日期)之外,还有一个从Format继承的重写的Format(对象)。它可用于格式化日期数字(自纪元以来的毫秒)。此方法是编译器在传递datetime时选择的方法。这就是为什么没有编译时错误消息的原因。

提示:当你不能立即理解错误信息时,把它粘贴到你的搜索引擎中。它常常会引导你找到一个解释和解决方案。也是在这种情况下。

  • Joda-Time主页
  • Oracle教程:日期时间说明如何使用java.Time.
  • Java规范请求(JSR)310,其中首次描述了Java.time
  • 三个后端口项目,Java.time到Java 6和7的后端口(JSR-310的三个后端口)。
  • Threetenabp,Android版ThreeTen Backport
  • 问题:如何在Android项目中使用ThreeTenABP,并有非常透彻的解释。
  • 维基百科文章:ISO 8601
  • 姐妹问题:Java:无法将给定对象格式化为日期。
 类似资料:
  • 问题内容: 我正在尝试将字符串转换为日期 但在我看来,它有一个。的。这是为什么?我想生成一个日期 问题答案: 日期字符串- 符合- d-每月的某天 M-一年中的月份 y-年 …

  • 问题内容: 是否可以将“ 20110210”转换为2011-02-10? 我试过,我得到 我究竟做错了什么? 我有新的SimpleDateFormat(“ yyyy-MM-dd”)而不是新的SimpleDateFormat(“ yyyyMMdd”) 问题答案: 这对我有用,不会引发异常:

  • 我正在尝试转换一个表示存储在SQLite中的日期的字符串。 日期存储到sqlite中,如下所示: 根据Java文档,方法: 返回此日期的字符串表示形式。格式设置相当于使用具有格式字符串“eee MMM dd hh:mm:ss zzz yyyy”的SimpleDateFormat,看起来类似于“tue Jun 22 13:07:00 PDT 1999”。则使用当前默认时区和区域设置。如果需要控制时区

  • 问题内容: 在Android中,每个事件的日期(例如生日和纪念日)都以String格式保存,例如“ 2011-12-24”。 至少我的手机是这种情况。如果某些其他电话的日历与公历不同,则可能以其他格式存储这些日期。 即使对于带有公历日历设置的电话,也存在带小时和分钟且不带日期和日期的日期字符串。当我查询联系人表中的事件时,得到这样的日期字符串: 结果是(例如): “ 2011-12-14”或“ 2

  • 问题内容: 我需要有关此java方法的一些建议。此方法的目的是采用表示日期的字符串-该字符串是从EST时区中的日期创建的-并将其转换为UTC时区中的java Date对象。 我看到的问题是dt的值似乎已关闭。例如,如果dateString为‘10 / 16/2012 12:06 PM’-我期望dt(以UTC为单位)的值类似于“ 2012年10月16日,星期二,下午4:06”。取而代之的是,dt的值

  • 问题内容: 该java.util.Date 方法显示当地时区的日期。 在几种常见的情况下,我们希望以UTC格式打印数据,包括日志,数据导出以及与外部程序的通信。 在UTC中创建String表示形式的最佳方法是什么? 如何用更好的格式替换无法排序的juDate 格式(感谢@JonSkeet!)? 附录 我认为以自定义格式和时区打印日期的标准方法非常繁琐: 我一直在寻找像这样的单线: 问题答案: 遵循