【问题标题】:date difference in mills to localdatetime工厂与本地日期时间的日期差异
【发布时间】:2022-06-16 20:06:18
【问题描述】:

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

这是我尝试过的:

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

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

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

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

例如:2022-10-102022-10-12 的区别应该是2022-10-02

【问题讨论】:

  • 对不起,这没有意义。假设您计算了一分钟的差异,所以得到了 60000 毫秒。这个数字并不表示任何计算出的实际日期,既不是 1970 年也不是 2022 年。LocalDateTime 表示一天中的日期和时间(不是那么有用),而不是金额的时间。为了您的不同,可以使用java.time.Duration

标签: java android


【解决方案1】:

java.time.LocalDateTime 不是为了表示两个日期之间的差异而创建的。应该使用 java.time.Periodjava.time.Duration (see Oracle docs)。

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

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

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

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

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

我建议你使用Duration 类,如果你想漂亮地打印它,你必须像这样手动完成(感谢this answer):

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()));

【讨论】:

  • 如果确实需要组合周期和持续时间,您可以在 ThreeTen-Extra 及其 PeriodDuration 中找到一个。但是,正如答案中提到的,将这两个概念结合起来在实践中往往会出现问题。
猜你喜欢
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2012-02-04
相关资源
最近更新 更多