【问题标题】:SimpleDateFormat appears to fail with "yyyy-MM-dd HH:mm:ss.SSS0"SimpleDateFormat 似乎因“yyyy-MM-dd HH:mm:ss.SSS0”而失败
【发布时间】:2012-07-27 03:51:16
【问题描述】:

为什么以下操作不起作用?看来最后的字面零是原因......

final DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS0");
format.setLenient(false);

String d = format.format(new Date());
System.out.println(format.parse(d));

【问题讨论】:

  • 为什么格式末尾需要零?
  • 我的数据集中的毫秒恰好在毫秒之后有一堆零......不知道为什么
  • @cellige - 请您使用数据集中的一些值更新问题。
  • 上面的代码为你格式化了一个值,但它不能把它解析回来。
  • 毫秒只是 3 位数字,您的数据如何保存在数据库中,使用 char/varchar 或 date/datetime/timestamp 值?在 char/varchar 的情况下,您可以修剪其他 0 值,这些值对您的数据没有任何价值。

标签: java parsing date formatting


【解决方案1】:

我不知道您为什么需要在模式末尾添加零 (0),但您应该将非模式字母包裹在 '' 中以使其正常工作:

final DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS'0'");

更多信息:


你的代码问题出在这一行

System.out.println(format.parse(d));

尝试将超过 3 位数的毫秒解析为 java.util.Date 将导致异常。解析字符串的模式应该是

"yyyy-MM-dd HH:mm:ss.SSS" //without the zero at the end, now your whole code will work...

如果您正在使用纳秒或您的数据包含纳秒,您可以忽略这些值,Java 日期/时间 API 也不支持纳秒(在文档中甚至没有提及)。

如果您真的非常需要将纳秒用于各种目的,那么您应该坚持使用 String 而不是 Date 对象。

【讨论】:

  • 更不用说文档说引用是针对字母格式化程序的。没有说你需要它,从我的小测试来看,数字似乎没有什么不同。
  • 您的日期值如何?为什么要解析带有附加零的日期?
  • @RichardSitze 如果您是一名科学家并且需要使用纳秒来执行您可能需要的任何操作,您应该自己处理这些值,Java API 无法帮助您。尽管如此,还是有 System.nanoTime() 方法在 long 变量中以纳秒处理当前时间。您可以想出一个很好的方法来将 long 转换为毫秒部分,然后将其乘以 1000 并添加纳秒(大量的艰苦工作......)
  • @Luiggi 就描述 parse wrt 毫秒的行为而言,您的答案是正确的。但是我相信正确的“答案”只是 SimpleDateFormat.parse 没有实现所描述的规范。我认为这是一个(次要)缺陷。您已经描述了这些限制,并提出了合理的解决方法——这很好。更糟糕的是,您的引用建议也应该有效......但它没有。
  • @RichardSitze 我已经编辑了答案。问题不在于格式,而在于解析,正如我在不同部分中解释的那样。
猜你喜欢
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
相关资源
最近更新 更多