首页 > 解决方案 > 计算以 Millis 为单位的日变化

问题描述

这两行计算自 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

标签: javaandroid

解决方案


这两行应该返回不同的值


如果您不向他们申请整数除法,他们会这样做。

因为 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

推荐阅读