【问题标题】:How can I add LocalTime into a Date object?如何将 LocalTime 添加到 Date 对象中?
【发布时间】:2021-04-23 16:17:59
【问题描述】:

如果我能做到我所要求的就完美了!

    <<LocalTime is provided as locTime>>
    Date flyDate = a.getDate();
    Date landingDate = b.getDate();

    flyDate.add(locTime);

或者我可以学习什么是最佳实践。

我有一堆 Flight 对象,目前它们每个都持有一个 Date 来确定航班的飞行日期/时间,还有一个用于 LocalTime 的持续时间,表示航班需要多少小时:分钟。

我想检查一个航班在时间方面是否与另一个航班兼容。 a 航班的着陆时间应早于 b 航班的飞行时间。

谢谢!

【问题讨论】:

  • 不要混用 Date 和 java.time API。此外,LocalTime 不是持续时间。 Duration 是一个持续时间。
  • 哦!如果没有,我可能会这样做。需要注意什么?
  • 决定,你想如何保持开始和着陆时间,例如LocalDateTime 或 ZonedDateTime。然后,考虑,例如LocalDateTime start = LocalDateTime.now(); Duration flightTime = Duration.ofHours(1).plusMinutes(30); LocalDateTime end = start.plus(flightTime);。使用ZonedDateTime 的工作方式类似。

标签: java date java-time


【解决方案1】:

您可能会追求以下内容:

    // Flying time for flight a
    ZonedDateTime aDepartureTime = ZonedDateTime.of(
            2021, 5, 1, 8, 0, 0, 0, ZoneId.of("Canada/Saskatchewan"));
    Duration aFlyingTime = Duration.ofHours(7).plusMinutes(45);
    ZonedDateTime aArrivalTime = aDepartureTime.plus(aFlyingTime)
            .withZoneSameInstant(ZoneId.of("America/Buenos_Aires"));
    
    // Flying time for flight b
    ZonedDateTime bDepartureTime = ZonedDateTime.of(
            2021, 5, 1, 18, 30, 0, 0, ZoneId.of("America/Buenos_Aires"));
    
    if (aArrivalTime.isBefore(bDepartureTime)) {
        System.out.format(
                "Flight b can be reached since arrival time %s is before departure time %s%n",
                aArrivalTime, bDepartureTime);
    } else {
        System.out.format(
                "Flight b cannot be reached since arrival time %s is not before departure time %s%n",
                aArrivalTime, bDepartureTime);
    }

输出是:

航班 b 到达时间后无法到达 2021-05-01T18:45-03:00[America/Buenos_Aires] 不在出发前 时间 2021-05-01T18:30-03:00[美国/布宜诺斯艾利斯]

使用 ZonedDateTime 表示时区中的日期和时间。使用 Duration 表示——好吧,类名说明了这一点。

编辑:

我在添加已连接的所有 Durations 时遇到问题 航班,最后加起来是 00:00。我用

    Duration duration = Duration.ofHours(0);
    duration.plus(flight.getDuration());

可能会发生什么问题?

常见的疏忽。对于您需要的第二个语句

    duration = duration.plus(flight.getDuration());

Duration 与几乎所有 java.time 类一样,是不可变的。因此plus 方法不会将另一个持续时间添加到持续时间本身,而是创建并返回一个新的Duration 对象,其中包含两个持续时间的总和。

另外,我怎样才能获得 hh:MM 版本的 Duration?

查看底部的链接。

LocalTime 是一天中的某个时间。不要尝试使用它一段时间。 LocalDateTime 是没有时区或与 UTC 偏移的日期和时间。由于您不知道它所在的时区,因此您不能将其用于涉及转换到另一个时区的计算。我知道LocalDateTime 经常被使用,但也经常在它不是真正适合工作的类的情况下使用。它没有太多好的用途。

链接

How to format a duration in java? (e.g format H:MM:SS)

【讨论】:

  • 我在添加已连接航班的所有时长时遇到问题,最后加起来是 00:00。我用Duration duration = Duration.ofHours(0); duration.plus(flight.getDuration()); 可能有什么问题?另外我怎样才能获得 hh:MM 版本的 Duration?
  • 请查看我的编辑(如果您还没有)
  • 我的救星!是的,当我认为这是一种就地方法并且甚至没有考虑它时,我感到很愚蠢:(格式化也工作得很好!
猜你喜欢
  • 1970-01-01
  • 2014-09-14
  • 2023-01-19
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 2012-01-09
  • 2017-05-03
相关资源
最近更新 更多