gpt4 book ai didi

Java时区通过双值更新

转载 作者:太空宇宙 更新时间:2023-11-04 10:26:17 25 4
gpt4 key购买 nike

我有一个包含国家/地区时区范围的表例如

国家:加拿大起始范围:-3.5结束范围:-8.0

我有一个方法可以从表中拉回开始和结束范围值我需要将系统时间(UTC)转换为国家/地区时间范围。如果我处理整数,那就没问题了,只需使用日历添加采用 int 值的常规方法,但我的方法返回 double

我有:

private Calendar[] setCountryTime( double startRange double endRange) {
Calendar[] clientTimeRange = null;
Date today = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(today);

Calendar clientStartRange = getCurrentServerTime();
clientStartRange.add(Calendar.HOUR_OF_DAY, //what value here);
clientStartRange.add(Calendar.MINUTE, //what value here);
clientTimeRange[0] = clientStartRange;

Calendar clientEndRange = getCurrentServerTime();
clientEndRange.add(Calendar.HOUR_OF_DAY, //what value here);
clientEndRange.add(Calendar.MINUTE, //what value here);
clientTimeRange[1] = clientEndRange ;

return clientTimeRange;

}

最佳答案

java.time

private static final long HOURS_TO_SECONDS = TimeUnit.HOURS.toSeconds(1);

private static OffsetDateTime[] setCountryTime(double startRange, double endRange) {
ZoneOffset startOffset = hoursToOffset(startRange);
ZoneOffset endOffset = hoursToOffset(endRange);
Instant now = Instant.now();
return new OffsetDateTime[] { now.atOffset(startOffset), now.atOffset(endOffset) };
}

private static ZoneOffset hoursToOffset(double offsetHours) {
long offsetSeconds = Math.round(offsetHours * HOURS_TO_SECONDS);
if (offsetSeconds < ZoneOffset.MIN.getTotalSeconds()
|| offsetSeconds > ZoneOffset.MAX.getTotalSeconds()) {
throw new IllegalArgumentException("Offset too large " + offsetHours);
}
return ZoneOffset.ofTotalSeconds((int) offsetSeconds);
}

让我们尝试一下:

    OffsetDateTime[] canadaTimeRange = setCountryTime(-3.5, -8.0);
System.out.println(Arrays.toString(canadaTimeRange));

刚才运行打印:

[2018-05-23T10:06:47.489234-03:30, 2018-05-23T05:36:47.489234-08:00]

由于我们可以根据秒数实例化 ZoneOffset,因此主要技巧是将小时转换为秒。如果我们只有整个小时,TimeUnit 枚举可以为您做到这一点。我们仍然可以使用它的转换因子进行乘法。它使我们的意图更清晰,代码更不容易出错。

Calendar 类早已过时且设计不佳。相反,我使用现代 Java 日期和时间 API java.time。和它一起工作真是太好了。如果您确实需要 Calendar 对象(例如,对于无法更改的旧版 API),则可以进行转换。

我们仍在使用 Java 7,因此我们使用日历

编辑没啥大问题,java.time在 Java 6 和 7 上运行良好。

  • 在 Java 8 及更高版本以及较新的 Android 设备(据我所知,从 API 级别 26 开始)中,现代 API 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,即新类的向后移植(ThreeTen for JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保使用子包从 org. Threeten.bp 导入日期和时间类。

链接

关于Java时区通过双值更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50488461/

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