以毫秒为单位计算日变化



这两行计算自1970年以来的天数。当我将手机的时间设置为23:55时,这两行应该返回不同的值,因为23:55+10分钟是新的一天。但不知何故,两行返回的值相同。

Log.d("Main", "today " + (int) (System.currentTimeMillis() / TimeUnit.DAYS.toMillis(1) ) );
Log.d("Main", "tomorrow " + (int) ((System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(10)) / TimeUnit.DAYS.toMillis(1) ) );

日志消息:

12-09  17109-17109/com.example..myapplication D/Main: 
today 17874        // 23:55
tomorrow 17874     // 00:05 this line should be 17875, because it's a new day

这两行应该返回不同的值


如果不应用整数除法,它们会

因为23:55+10分钟是新的一天


是的,但自1970年以来,只多了10分钟

检查允许比整数除法更准确除法的代码:

System.out.println("today " +
(System.currentTimeMillis() * 1.0 / TimeUnit.DAYS.toMillis(1)));
System.out.println("tomorrow " +
((System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(10)) * 1.0 / TimeUnit.DAYS.toMillis(1)));

将打印:

today 17872.55873355324
tomorrow 17872.565677997685

您的代码截断了十进制数字,并且您认为这两行返回的结果相同

当然,如果不是增加10分钟,而是增加1天,代码中的结果将是正确的:

System.out.println("today " +
(int) (System.currentTimeMillis() / TimeUnit.DAYS.toMillis(1)));
System.out.println("tomorrow " +
(int) ((System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1)) / TimeUnit.DAYS.toMillis(1)));

将打印:

today 17872
tomorrow 17873

正确使用Java日期/时间API,我会选择

public long getDaysFromEpoch(Instant moment){
return ChronoUnit.DAYS.between(
Instant.EPOCH, 
moment
);
}

使用一个瞬间,你可以从毫秒中获得一个瞬间:

System.out.println(getDaysFromEpoch(Instant.now()));     //17872
System.out.println(getDaysFromEpoch(Instant.now().plus(1, ChronoUnit.DAYS))); //17873
System.out.println(getDaysFromEpoch(Instant.ofEpochMilli(100_000_000_000L))); //1157

使用joda time:joda time:2.9.9库,使用和播放这个库非常简单

最新更新