【问题标题】:Difference between two date and times两个日期和时间之间的差异
【发布时间】:2023-03-24 07:54:01
【问题描述】:

我需要找出时间之间的差异。这是我的代码

LocalDateTime ltdNow = LocalDateTime.now();

LocalDateTime ltdThen = LocalDateTime.parse("2020-07-30T08:00:00");

Duration duration = Duration.between(ltdNow, ltdThen);
System.out.println(duration.toDays + " Days and " + duration.toHours);

但是我需要这种格式 23 Days and 17 Hours 但它给了我像 19804 这样的大数字作为小时。 我怎样才能把它转换成这种格式?

【问题讨论】:

  • 我知道你在瑞典。在瑞典,夏令时 (DST) 在 10 月 24 日至 25 日的晚上结束,因此从 2020-10-24T12:00:00 到 2020-10-25T12:00:00 将是 25 小时,而不是 24 小时。然后你想要1 days and 1 hours 或只是1 day and 0 hours
  • toHours() 和 toDays() 需要括号。

标签: java android datetime date


【解决方案1】:

LocalDateTime#until

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class Main {
    public static void main(String[] args) {
        LocalDateTime ltdThen = LocalDateTime.parse("2020-07-30T08:00:00");
        LocalDateTime ltdNow = LocalDateTime.now();

        // ###########With Java-8###########
        long days = ltdNow.until(ltdThen, ChronoUnit.DAYS);
        long hours = ltdNow.until(ltdThen, ChronoUnit.HOURS);
        System.out.println(days + " days and " + (hours % 24) + " hours.");

        // ###########Java-9 onwards###########
        Duration duration = Duration.between(ltdNow, ltdThen);
        System.out.println(duration.toDaysPart() + " days and " + duration.toHoursPart() + " hours.");
    }
}

输出:

22 days and 15 hours.
22 days and 15 hours.

注意:Duration#toDaysPartDuration#toHoursPart 是随 Java-9 引入的。

【讨论】:

    【解决方案2】:

    toHours() 就像它所说的那样:两个日期之间的小时数。

    试试toHoursPart(),我想这就是你要找的东西:

    System.out.println(duration.toDays() + " Days and " + duration.toHoursPart());
    

    【讨论】:

      【解决方案3】:
          ZoneId zone = ZoneId.of("Europe/Stockholm");
          
          ZonedDateTime zdtNow = ZonedDateTime.now(zone);
          ZonedDateTime zdtThen = LocalDateTime.parse("2020-10-26T08:00:00").atZone(zone);
          
          long days = ChronoUnit.DAYS.between(zdtNow, zdtThen);
          ZonedDateTime afterDays = zdtNow.plusDays(days);
          long hours = ChronoUnit.HOURS.between(afterDays, zdtThen);
          
          System.out.println("" + days + " days and " + hours + " hours");
      

      今天在瑞典时间 18:00 之前运行时的输出:

      110 天 14 小时

      消息:

      • 不要相信 Duration 类来计算天数。它像往常一样以 24 小时计算一天。由于夏令时 (DST) 和其他异常情况,现实生活中的一天有时会更长或更短。我在上面所做的计算跨越了瑞典从夏季时间到标准时间的过渡,并正确地将 10 月 25 日计算为 25 小时,而不是 24 小时。
      • 不要自己进行除法或乘法来转换天数和小时数。一,由于刚才所说的原因,它并没有给你一个可靠的结果。二,如果这是您想要的,您仍应将转换保留为库类,例如 Duration

      【讨论】:

      • 准确答案 ;)
      • 我不认为在这种情况下使用LocalDateTimeZonedDateTime 是否有任何区别,因为给定的日期时间字符串没有时区信息。当谈到不同 TZ 中日期时间之间的差异时,时区确实很重要,但是当谈到同一时区中两个日期时间之间的差异时,我们使用哪个 TZ 并不重要。我错过了什么吗? 注意: 我很自豪地说,我学到的有关现代日期时间 API 的大部分内容都归功于您和 Basil Bourque
      • @ArvindKumarAvinash 只要您确定开始时间和结束时间都在同一个时区,它很少会产生影响。极端情况是计算 小时 直到晚上时钟改变的时间。在这种情况下,当晚从 01:00 到 04:00 有 4 个小时,LocalDateTime 显然只会算 3。当然,你想要什么样的结果,你必须自己决定。
      • 谢谢,@OleV.V。为了解释它。
      【解决方案4】:

      使用期限:

      LocalDateTime ltdNow = LocalDateTime.now();
      LocalDateTime ltdThen = LocalDateTime.parse("2020-07-30T08:00:00");
      Period p = Period.between(ltdThen , ltdNow );
      long p2 = ChronoUnit.DAYS.between(ltdThen , ltdNow );
      System.out.println("You are " + p.getYears() + " years, " + p.getMonths() +
                         " months, and " + p.getDays() +
                         " days old. (" + p2 + " days total)");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-19
        • 2011-10-29
        • 2021-10-21
        • 2021-11-25
        • 2011-08-01
        • 2013-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多