这两行计算自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库,使用和播放这个库非常简单