android - date 毫秒与本地日期时间的差异

在计算出两个 dates 之间的差异后,我需要再次打印 date。

这是我尝试过的:

fun getRemainingTime(endTime: ZonedDateTime): Long {
        val currentTime = ZonedDateTime.now(ZoneId.systemDefault())

        return dateUtils.durationDifference(currentTime, endTime).toMillis()
    }

但是当我再次尝试将其转换为如下所示的 localdate 时,它以 1970 开头。所以我需要实际计算出的 date 。

LocalDateTime.ofInstant(Instant.ofEpochMilli(remainingDurationInMillis), ZoneId.systemDefault())

回答1

java.time.LocalDateTime 不是为了表示两个 dates 之间的差异而创建的。应该使用 java.time.Periodjava.time.Durationhttps://docs.oracle.com/javase/tutorial/datetime/iso/period.html)。

Duration 使用基于时间的 values(秒、纳秒)测量时间量。 Period 使用基于 date 的 values(年、月、日)。

它们都有一个方便的 .between() 方法,您可以像这样使用它:

Duration diff = Duration.between(ZonedDateTime.now(ZoneId.systemDefault()), endTime);

没有组合类将持续时间表示为年、月、日和小时、分钟、秒的原因是一天可能是 24 或 25 小时,具体取决于夏令时。所以

一天的 Duration 正好是 24 小时。一天的 Period 添加到 ZonedDateTime 时,可能会因时区而异。例如,如果它发生在夏令时的第一天或最后一天。

我建议你使用 Duration 类,如果你想漂亮地打印它,你必须像这样手动完成(感谢 https://stackoverflow.com/a/40487511/8629960):

System.out.println(diff.toString()
            .substring(2)
            .replaceAll("(\\d[HMS])(?!$)", "$1 ")
            .toLowerCase());

这将打印类似 370h 24m 14.645s 的内容。如果你想要几天、几个月和几年,你必须从秒计算它们并打印出来。

如果您使用的是 Java 9+,则有一些方法可以获取持续时间中的天数、小时数、分钟数和秒数:

System.out.println(String.format("%sd %sh %sm %ss", 
            diff.toDaysPart(), 
            diff.toHoursPart(), 
            diff.toMinutesPart(), 
            diff.toSecondsPart()));

相似文章

随机推荐

最新文章