【发布时间】:2020-05-21 02:25:26
【问题描述】:
TimeUnit.DAYS.convert(
Math.abs(
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("30-03-2020 00:00:00").getTime() -
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("1-03-2020 00:00:00").getTime()
),
TimeUnit.MILLISECONDS)
结果是 28,而应该是 29。
时区/位置可能是问题吗?
【问题讨论】:
-
注意:请不要再使用
SimpleDateFormat,因为它已经过时了。请改用来自java.time的包。在SimpleDateFormat的情况下,使用DateTimeFormatter。如果是 Java 7,请参阅下面的 Andy Turner 的评论。 -
不要按时做数学。使用适当的时间库(
java.time[虽然我注意到您使用的是 Java 7],ThreeTenBp,Joda)。 -
我很想参加有人去的会议“好的,现在我们已经确定了时区,让我们采用 100% 的愚蠢模式并实施这个叫做夏令时的东西昨晚酸痛之后,我在梦中。”
-
@gmauch
TimeUnit不会假装对夏令时一无所知。正如javadoc所说:纳秒定义为千分之一微秒,微秒定义为千分之一毫秒,毫秒定义为千分之一秒,一分钟定义为六十秒,一小时定义为六十分钟,以及一天二十四小时。 --- 由于 DST 导致一年中的 2 天不完全是 24 小时,所以当涉及 DST 时TimeUnit会出错。 -
此问题仅发生在处于夏令时时区的计算机上。它在没有夏令时的时区给出正确的天数 (29)!