如何将localtime添加到date对象中?

9fkzdhlc  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(329)

如果我能按我的要求做,那就完美了!

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

    flyDate.add(locTime);

或者我可以学习什么是最佳实践。
我有一堆飞行物体,现在它们每个都有一个日期来决定飞行的日期/时间,还有一个是localtime,表示飞行持续时间hours:minutes will 飞机起飞了。
我想检查一个航班和另一个航班在时间上是否兼容。a航班的着陆时间应该在b航班的起飞时间之前。
谢谢您!

t3irkdon

t3irkdon1#

您可能需要以下内容:

// 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);
    }

输出为:
由于抵达时间2021-05-01t18:45-03:00[美国/布宜诺斯艾利斯]不在起飞时间2021-05-01t18:30-03:00[美国/布宜诺斯艾利斯]之前,无法到达b航班
使用 ZonedDateTime 时区中的日期和时间。使用 Duration 因为-好吧,这个班级的名字说明了这一点。
编辑:
我在添加所有 Duration 如果是联程航班,最后加起来是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 它经常被使用,但也经常出现在不适合工作的情况下。它没有太多好的用途。
链接
如何在java中格式化持续时间(e、 g格式(h:mm:ss)
我对同一个问题的回答(至少需要Java9)

iecba09b

iecba09b2#

正如其他人所说,这是一个有问题的问题,因为localtime和date实际上代表了完全不同且几乎不相关的概念。localtime是一天中没有时区的时间,例如19:45(或7:45 pm)。日期是时间线上的一个点;如果恰好在某个时区某个日期的19:45,在其他时区则不会。
我认为,将日期(实际上)误用为一小时的传统方式是将其设置为jvm的默认时区中的1970年1月1日。这种做法承担了前面提到的所有责任。特别是jvm默认时区设置可以随时从程序的另一部分或在同一jvm中运行的任何其他程序更改。这意味着一个完全不相关的程序可能会突然导致您的日期指示一天中与您初始化的时间不同的时间。
我们没什么比这更好的了,就这样吧

LocalTime time = LocalTime.of(11, 0);

    Instant timeOnEpochDayInDefaultTimeZone = LocalDate.EPOCH
            .atTime(time)
            .atZone(ZoneId.systemDefault())
            .toInstant();
    Date oldfashionedDateObject = Date.from(timeOnEpochDayInDefaultTimeZone);

    System.out.println(oldfashionedDateObject);

最后输出是
1999年5月3日星期二11:00:00 utc

相关问题