gpt4 book ai didi

java - 时差计算错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:24:39 26 4
gpt4 key购买 nike

我必须计算出发机场和到达机场之间的总飞行时间分钟数。

此工作由以下代码片段完成:

    public int calculateFlightDuration(String departureDateTime, String depAirportCode, String arrivalDateTime,
String arrAirportCode) {
try {
LocalDateTime depLocalTime = LocalDateTime.parse(departureDateTime, formatter);
LocalDateTime arrLocalTime = LocalDateTime.parse(arrivalDateTime, formatter);

ZoneOffset depZoneOffset = getTimeZoneOffset(depAirportCode);
ZoneOffset arrZoneOffset = getTimeZoneOffset(arrAirportCode);

if (depZoneOffset != null && arrZoneOffset != null) {

OffsetDateTime offsetDepTime = OffsetDateTime.of(depLocalTime, depZoneOffset);
OffsetDateTime offsetArrTime = OffsetDateTime.of(arrLocalTime, arrZoneOffset);

Duration flightDuration = Duration.between(offsetArrTime, offsetDepTime).abs();

return (int) flightDuration.toMinutes();

}

} catch (Exception e) {
LOG.warn("::calculateFlightDuration depTime:{} dep.code:{} arrTime:{} arr.code:{}", departureDateTime,
depAirportCode, arrivalDateTime, arrAirportCode);
}

return 0;
}

问题是:

当我想用这些参数计算 future 飞行的持续时间时:

depLocalTime = 2017-11-06T14:50
arrLocalTime = 2017-11-06T16:45
depZoneOffset = +03:00
arrZoneOffset = +02:00

作为这些参数的结果,flightDuration 对象是:

flightDuration = PT2H55M

似乎一切都很好,对吧?但实际上不行。让我解释一下;

出发机场代码是 IST(土耳其),到达机场代码是 AMS(荷兰),关键是:

2017-10-29之后(在我计算的时间之前),AMS时间将倒退1小时,其偏移量为+01:00,IST偏移量仍为+03:00。所以正确的持续时间对象必须是:

flightDuration = PT3H55M

我该如何解决这个问题?这真的很烦人。感谢您的帮助。

在 ZonedDateTime 评论后编辑:

伙计们,我还尝试使用 ZonedDateTime 对象进行计算。这是使用了 ZonedDateTime 对象的代码,它对结果没有影响。

    public int calculateFlightDuration(String departureDateTime, String depAirportCode, String arrivalDateTime,
String arrAirportCode) {
try {
LocalDateTime depLocalTime = LocalDateTime.parse(departureDateTime, formatter);
LocalDateTime arrLocalTime = LocalDateTime.parse(arrivalDateTime, formatter);

ZoneOffset depZoneOffset = getTimeZoneOffset(depAirportCode);
ZoneOffset arrZoneOffset = getTimeZoneOffset(arrAirportCode);

if (depZoneOffset != null && arrZoneOffset != null) {

ZonedDateTime zonedDepTime = ZonedDateTime.of(depLocalTime, depZoneOffset);
ZonedDateTime zonedArrTime = ZonedDateTime.of(arrLocalTime, arrZoneOffset);

// OffsetDateTime offsetDepTime = OffsetDateTime.of(depLocalTime, depZoneOffset);
// OffsetDateTime offsetArrTime = OffsetDateTime.of(arrLocalTime, arrZoneOffset);

Duration flightDuration = Duration.between(zonedDepTime, zonedArrTime).abs();

return (int) flightDuration.toMinutes();

}

} catch (Exception e) {
LOG.warn("::calculateFlightDuration depTime:{} dep.code:{} arrTime:{} arr.code:{}", departureDateTime,
depAirportCode, arrivalDateTime, arrAirportCode);
}

return 0;
}

在@Joe C 的回答之后,我再次更改了代码,我相信这是我应该走的路:

    public int calculateFlightDuration(String departureDateTime, String depAirportCode, String arrivalDateTime,
String arrAirportCode) {
try {
LocalDateTime depLocalTime = LocalDateTime.parse(departureDateTime, formatter);
LocalDateTime arrLocalTime = LocalDateTime.parse(arrivalDateTime, formatter);

ZoneId depZoneId = getTimeZoneId(depAirportCode);
ZoneId arrZoneId = getTimeZoneId(arrAirportCode);

if (depZoneId != null && arrZoneId != null) {

ZonedDateTime zonedDepTime = ZonedDateTime.of(depLocalTime, depZoneId);
ZonedDateTime zonedArrTime = ZonedDateTime.of(arrLocalTime, arrZoneId);

Duration flightDuration = Duration.between(zonedDepTime, zonedArrTime).abs();

return (int) flightDuration.toMinutes();

}

} catch (Exception e) {
LOG.warn("::calculateFlightDuration depTime:{} dep.code:{} arrTime:{} arr.code:{}", departureDateTime,
depAirportCode, arrivalDateTime, arrAirportCode);
}

return 0;
}

但是:Java 假定伊斯坦 boolean 也将其时区偏移更改为 +02:00,但它不会发生。我想我还需要更新我的 Java。这是代码更改后的结果:

depZoneId = Europe/Istanbul
arrZoneId = Europe/Amsterdam
zonedDepTime = 2017-11-06T14:50+02:00[Europe/Istanbul] //damn it's really annoying!
zonedArrTime = 2017-11-06T16:45+01:00[Europe/Amsterdam]

aa 和飞行时间保持不变:

flightDuration = PT2H55M

谢谢大家的回答。现在我必须修复伊斯坦 boolean 的时区变化。

最佳答案

OffsetDateTime假设全年有一个共同的偏移量(例如 UTC+2)。它不涵盖夏令时的任何内容。

如果你想考虑夏令时,你应该使用 ZonedDateTime相反,使用 ZoneId .在Europe/Amsterdam的情况下,它将根据一年中的时间选择 UTC+1 或 UTC+2。

ZonedDateTime zonedDepTime = ZonedDateTime.of(depLocalTime, ZoneId.of("Asia/Istanbul"));
ZonedDateTime zonedArrTime = ZonedDateTime.of(arrLocalTime, ZoneId.of("Europe/Amsterdam"));

关于java - 时差计算错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46559539/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com