减去1ms会导致意外行为

时间:2013-09-22 17:01:09

标签: java date datetime

有什么问题?我假设如果我从1980年1月1日0:0:0减去1ms然后我得到1979.但是我必须减去大约500+ ms。请给我一个提示。

val cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
cal.set(1980, 0, 1, 0, 0, 0)
val date = new Date
date.setTime(cal.getTimeInMillis()) // <- 1980 Jan 01 0:0:0
date.setTime(cal.getTimeInMillis() - 1) // <- 1980 Jan 01 0:0:0 too !!!

更新

解决方案是

val cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
cal.setTimeInMillis(0)
cal.set(1980, 0, 1, 0, 0, 0)

1 个答案:

答案 0 :(得分:5)

使用Calendar.set(year, month, day, hourOfDay, minute, second)设置毫秒数。因此,Calendar实现将毫秒设置为“未知”,实际上将其视为给定秒内的中点。

减去500毫秒意味着你只是跨过中点。如果你添加500毫秒也会发生同样的情况,这应该会让你刚刚超过秒。实际上减去500ms是有效的,你必须加上620ms才能看到下一秒。