长整型转换为错误的时间

3

我正在尝试将一个长时间格式化为天、小时、分钟和秒,并在网上找到了一种方法。

public static String getTime(long time) {
    long enlapsed = System.currentTimeMillis() - time;
    long days = TimeUnit.MILLISECONDS.toDays(enlapsed);
    enlapsed -= TimeUnit.DAYS.toMillis(days);

    long hours = TimeUnit.MILLISECONDS.toHours(enlapsed);
    enlapsed -= TimeUnit.HOURS.toMillis(hours);

    long minutes = TimeUnit.MILLISECONDS.toMinutes(enlapsed);
    enlapsed -= TimeUnit.MINUTES.toMillis(minutes);

    long seconds = TimeUnit.MILLISECONDS.toSeconds(enlapsed);

    String result = days + "d " + hours + "h " + minutes + "m " + seconds + "s ";
    return result.replace("0d ", "").replace("0h ", "").replace("0m ", "").replace("0s ", "");
}

之前一切正常,但现在突然输入4380却显示18151天15小时33分钟34秒。我做错了什么?


你期望输入4380后的输出是什么? - Sweeper
将毫秒转换为天、小时、分钟和秒。 - Dan
2个回答

2
你在网上找到的方法是用来计算当前时间和给定时间戳之间经过了多长时间。你可以测试此方法是否可行,例如访问此类网站,将时间戳乘以1000转换为毫秒,并将其传递给getTime
时间戳4380表示Java Epoch后的4380ms,大约是1970年1月1日,约18000天前。
如果您需要最近的一个例子,时间戳1568312340000只是我开始写作前几分钟的时间戳,执行System.out.println(getTime(1568312340000L));会得到更短的持续时间。
您似乎想要的不是计算现在和特定时间戳之间经过的时间。您似乎只是想将一定数量的毫秒转换为以天、小时、分钟和秒表示的持续时间。
该方法首先计算现在和给定时间戳之间的毫秒差异,并将该差异放入名为elapsed的变量中。然后计算有多少天、小时、分钟和秒钟包含在elapsed毫秒中。您需要做的是除了计算差异的第一部分,删除所有这个方法所做的内容。因此,您应该删除这一行:
long enlapsed = System.currentTimeMillis() - time;

并将其替换为:

long enlapsed = time;

因为您只希望它直接计算出time参数表示的持续时间。


我刚刚发现我的代码中出现了一个新的问题,有时候结果是空的,什么也不显示。 - Dan
@Dan 可能是因为你输入了0? - Sweeper
不,我输入了803。 - Dan
1
@Dan 803毫秒小于一秒,因此该方法不会输出任何内容。您想让它输出“0秒”吗? - Sweeper

0

如果您的方法输入为4380,则返回自纪元以来的时间减去约4秒。 纪元是1970-01-01,因此18151天/ 365.25 = 49.7年 - 在2019年9月看起来是正确的。


我的错误在于我一直在做currentTime - enlapsed,而它已经在调用方法时在参数中完成了。但现在我注意到有时结果什么也没有,就像我现在有803,但我得到的是“”,这是什么原因? - Dan
803毫秒少于一秒。您的replace(...)调用将其消除,因为所有内容都为0。 - swpalmer
我该如何获取剩余的毫秒数呢? - Dan
看代码,跟随模式。你明白你的“enlapsed”变量是什么吗?(顺便提一下,你应该修复那个拼写错误 - “elapsed”) - swpalmer
我只需要添加 enlapsed -= TimeUnit.SECONDS.toMillis(seconds);,然后剩余的经过的时间就是毫秒数,对吗? - Dan
没错。按照这个模式,每一步中,“enlapsed”是你还没有用更大的时间单位计算的毫秒数。 - swpalmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接