2013-09-22 52 views
5

出了什么问题?我假设如果我从1980年1月1日0:0:0减去1ms,那么我得到了1979年。但是我必须为此减去约500ms以上。请给我一个提示。减1ms会导致意外行为

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) 
+0

只是一个猜测,但也许内部日历轮到秒? – Aaron

+0

尝试在第一个'setTime()'调用后打印'date'内容。也许年,月,日,小时,分和秒是你设定的值,但不是毫秒。 –

+0

这有点令人困惑。我不想使用尤达时间或另一个第三部分库。我需要将年,月,日转换为毫秒,然后获取当天的最后毫秒。我想为此找到正确的解决方案。不幸的是,javadoc对这种情况保持沉默。 – Ezhik

回答

5

随着Calendar.set(year, month, day, hourOfDay, minute, second)没有毫秒被设置。因此,Calendar实现将毫秒设置为“未知”,实际上它被视为给定秒内的中点。

减500ms意味着你只是跨过中点。如果添加500毫秒,应该会发生同样的情况,这应该会在第二秒之后才会出现。实际上减去500ms的作品,你必须加上620ms才能看到下一秒。

+0

如何正确获取1979年的最后一个毫秒? – Ezhik

+0

减去500ms不一定会给出1979年的最后一个毫秒。 –

+0

@Ezhik,用'calendar.set(Calendar.MILLISECOND,0)'明确设置毫秒。当你从中减去1毫秒时,你直接得到1979年的最后一毫秒。 – jboi