我要做的是存储一个日期,用长毫秒表示,即当前时间的下一个午夜。所以,在晚上10:11发布这个,我想要一个代表明天上午12:00的日期。对于这个任务,我编写了这行代码(知道一天中有86400000毫秒):

long time = System.currentTimeMillis() + (86400000 - (System.currentTimeMillis() % 86400000));

该行用于计算从最后一个午夜开始的额外毫秒数,减去从一整天开始的毫秒数以查找到下一个午夜的时间,然后将其添加到当前时间,以便新值是下一个午夜的值。不管出于什么原因,我用来调试的date对象在调用tostring()方法时会弹出“wed apr 20 20:00:00 edt 2016”。当前时间被称为“2016年4月19日星期二美国东部时间22:08:34”,同时计算另一个日期。
这意味着毫秒的长度实际上代表第二天晚上8:00,而我希望它代表上午12:00。有人能帮我找出我逻辑上的缺陷吗?
我很可能遗漏了一些显而易见的东西,所以请容忍我。
注:我也尝试过这样计算时间:
long time = System.currentTimeMillis() - (System.currentTimeMillis() % 86400000) + 86400000;

但这导致了相同的日期对象。

最佳答案

你忘了调整你的时区。这里有一个简单的方法来实现这一点。

TimeZone tz = TimeZone.getDefault();
long time = System.currentTimeMillis() + (86400000 - (System.currentTimeMillis() % 86400000));
time -= tz.getOffset(time);

System.out.println(new Date(time));

10-08 16:49