【发布时间】:2018-07-11 08:54:28
【问题描述】:
我需要将 Java Date 对象格式化为 yyyyMMdd 之类的字符串(逐日取整)。例如,20180129。我有以下实现:
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
sdf.format(roundedDate);
该代码大部分时间都有效,但有时它会生成像2018129 这样的结果,这不是我想要的。所以我的数据库中会同时包含20180129 和2018129。
应用程序使用来自 MQ 的消息并将消息中的时间戳汇总到 Java Date 对象中。并将日期格式化为上述字符串。
问题是我无法在调试模式下重现该问题。它总是在调试器中产生预期的结果。但是当我在服务器(在 Docker 中)上运行它一段时间后,我看到了这些损坏的数据。
我想知道为什么 SimpleDateFormat 在给定一个有效的 Date 对象的情况下会有这种不确定的行为?任何想法将不胜感激。
【问题讨论】:
-
你不可能同时得到
20180129和2018129的格式与你所展示的相同。要么你有线程问题,要么在一个地方你有错字,格式是yyyyMdd。 -
@JimGarrison 谢谢。让我再看一遍代码。但我确信我没有线程问题,因为我创建了一个
SimpleDateFormat的新实例来在每次调用该方法时完成这项工作。 -
您为什么要使用早已过时且臭名昭著的麻烦
SimpleDateFormat类?java.time, the modern Java date and time API, 和它的DateTimeFormatter使用起来更好。 -
出于好奇,我一直在研究
SimpleDateFormat的源代码。不能保证我做对了,但似乎在格式模式字符串中使用非负月份值和MM,我们最终以a method calledzeroPaddingNumber和minDigits等于2,然后我看不到任何办法你可以在输出中得到1而不是01。 -
@OleV.V.谢谢你的信息。我使用的是旧版本,因为代码库是 java 1.7。我想对于新应用,我会改用新的 API。
标签: java simpledateformat