在计算出两个 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.Period
和 java.time.Duration
(https://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()));