java - 如何将 x 天添加到当前时间,然后从计算的时间中获取天数、小时数、分钟数
问题描述
这是我的代码,但结果与预期不同。它显示 14 天而不是 30 天,我希望它显示剩余的天数、小时数、分钟数,直到时间 >= System.currentTimeMillis() (直到计算出的时间戳高于或等于当前时间(以毫秒为单位))
int time = (int)System.currentTimeMillis() + 30 * 24 * 60 * 60); //current Time + 30 days
int day = (int)TimeUnit.MILLISECONDS.toDays(time);
int hour = (int) TimeUnit.MILLISECONDS.toHours(time) - (day * 24);
int min = (int) ((int)TimeUnit.MILLISECONDS.toMinutes(time) - (TimeUnit.MILLISECONDS.toHours(time) * 60));
解决方案
这里有各种各样的问题。
int time = (int)System.currentTimeMillis() + (30 * 24 * 60 * 60)
在这一行中,您将分钟添加到毫秒。(30 天,24 小时,60 分钟,60 秒)。
此外,您将所有内容都转换为 int,而函数返回 long。在说话的那一刻,这个函数应该返回的值是:1580097230808(它以毫秒为单位返回自纪元以来的时间)。
int 的最大值是 2,147,483,647,小于 1.580.097.230.808,所以基本上会导致溢出(会溢出多次)。
此外,需要添加到时间变量 (30 * 24 * 60 * 60 * 1000) 的值应该首先转换为 long,因为它对于 int 来说太大了。
因此,当我们执行所有这些步骤时,将产生以下代码:
long time = System.currentTimeMillis() + ((long) 30*24*60*60*1000);
System.out.println(time);
int day = (int)TimeUnit.MILLISECONDS.toDays(time);
int hour = (int) TimeUnit.MILLISECONDS.toHours(time) - (day * 24);
int min = (int) ((int)TimeUnit.MILLISECONDS.toMinutes(time) - (TimeUnit.MILLISECONDS.toHours(time) * 60));
System.out.println(day);
System.out.println(hour);
System.out.println(min);
打印以下结果:
1584393882681 // time in milliseconds since epoch
18337 // number of days since epoch (not the right output)
21 // not the right output
24 // not the right output
要获得正确的输出:
long currentTime = System.currentTimeMillis();
long time = System.currentTimeMillis() + ((long) 30*24*60*60*1000);
System.out.println(time);
int day = (int)TimeUnit.MILLISECONDS.toDays(time - currentTime);
int hour = (int) TimeUnit.MILLISECONDS.toHours(time - currentTime);
int min = (int) TimeUnit.MILLISECONDS.toMinutes(time - currentTime);
System.out.println(day);
System.out.println(hour);
System.out.println(min);
印刷:
1584394180556 // time since epoch in milliseconds
30 // days left
720 // hours left
43200 // minutes left
因此,对于最后一个函数,您需要给它们一个以毫秒为单位的时间,这样您就不必自己进行任何转换。基本上我们做了我们计算的时间戳减去当前时间,这些函数将根据值(时间 - 当前时间)计算天、小时和分钟。
推荐阅读
- python - 在 x 轴上创建月份和年份的时间序列图
- android - 在android应用程序中自动化谷歌表单的最佳方法
- databricks - Databricks 初始化脚本有时不起作用
- django - Django + Vue 部署 pythonanywhere.com
- python - 在另一个区域中调用 Lambda 并在调用的区域中进行更改
- reactjs - 如何使用上传的图像 url 注入输入字段以及如何将带有表单的 url 提交到 mongodb?
- salesforce-lightning - LWC 专家超级徽章 - 挑战 14 错误:我们找不到组件 similarBoats 的 meta.xml 部分
- python - 与 for 循环相比,为什么使用星号创建元组数组要快得多?
- java - Java 8 不见了
- reactjs - 在 React 中使用模式的项目列表上打开模式