gpt4 book ai didi

java - 根据 UTC 的不同时区处理 Java 夏令时(joda Interval)

转载 作者:行者123 更新时间:2023-11-30 07:06:04 26 4
gpt4 key购买 nike

我需要返回List<Interval> intervals基于我从用户那里得到的输入。除非该范围包括夏令时,否则一切正常。如果发生这种情况,我在该特定日期之后得到的响应会有点困惑(在本例中为美国东部标准时间 11 月 1 日)。

由于我的数据在数据库中以 UTC 形式存储,所以我正在使用 UTC(请求采用 UTC 格式,我的响应也采用 UTC 格式),但是,在浏览器中,时间会转换为本地时区。在后端,我可以访问用户时区。
现在的问题是如何将响应时间转换为包含夏令时的 UTC。

public List<Interval> buildIntervals(BinInterval binSize) {
final DateTime intervalStart = binSize.getInterval().getStart();
final DateTime intervalEnd = binSize.getInterval().getEnd();

final DateTimeZone tz = getCurrentUserTimezone();
List<Interval> intervals = new ArrayList<>();

MutableDateTime currentBinStart = new MutableDateTime(intervalStart);
MutableDateTime currentBinEnd = new MutableDateTime(intervalStart.plus(binSize.getPeriod()));

while (currentBinEnd.isBefore(intervalEnd)) {

intervals.add(makeInterval(currentBinStart, currentBinEnd));

currentBinStart = new MutableDateTime(currentBinStart.toDateTime().plus(binSize.getPeriod()));
currentBinEnd = new MutableDateTime(currentBinEnd.toDateTime().plus(binSize.getPeriod()));

}
}

private static Interval makeInterval(BaseDateTime start, BaseDateTime end) {
return new Interval(start.toDateTime().withZone(DateTimeZone.UTC),
end.toDateTime().withZone(DateTimeZone.UTC));
}

这是错误的示例响应:

第 17 行的正确版本应该是:endDate: "2015-11-02T05:00:00.000z"

enter image description here

从第 17 行开始,结束时间应为 +5。
从第 18 行开始,开始时间也应该是 +5,但由于某种原因,它在夏令时之前和之后无法以正确的方式转换时间。

如果我选择 11 月 1 日之后的范围,它会完美运行并将其全部转换为 +5。

我的本​​地时区是东部时间。

最佳答案

我假设您需要为发生夏令时的特殊情况创建不同大小的间隔。

我建议获取开始时间和结束时间的偏移量,并根据这些值您可以决定是否需要更改结束日期。

public static void main(String[] args) {
DateTimeZone EDT = DateTimeZone.forID("America/Toronto");
DateTime start = new DateTime(2016, 5, 15, 4, 0, DateTimeZone.UTC);
DateTime end = start.plusDays(2);

int offset1 = (int) TimeUnit.MILLISECONDS.toMinutes(EDT.getOffset(start.getMillis()));
int offset2 = (int) TimeUnit.MILLISECONDS.toMinutes(EDT.getOffset(end.getMillis()));
if (offset1 != offset2) {
end = end.plusMinutes(offset1 - offset2);
}

System.out.println(new Interval(start.toDateTime().withZone(EDT),
end.toDateTime().withZone(EDT)));

}

关于java - 根据 UTC 的不同时区处理 Java 夏令时(joda Interval),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40116072/

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