我的时间为 12:00:00,格式为 HH:mm:ss。
我知道这次来自设置了 +3 偏移量的服务器。
如果我使用 SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
,它会根据设备解析时间,该设备可以位于不同的时区。
除了将其添加到原始字符串之外,还有其他方法可以解析+3偏移量吗?
最佳答案
首先,您的服务器是否应该以 UTC 格式发送时间?如果客户遍布各地,这看起来会更加时区中立和标准化。然而,在代码中处理它的方式不会有太大不同。在任何情况下,UTC 格式的服务器偏移量都可以是常量:
private static final ZoneOffset serverOffset = ZoneOffset.ofHours(3);
不过,在实际代码中,您可能希望以某种方式对其进行配置。解析:
OffsetTime serverTime = LocalTime.parse("12:00:00").atOffset(serverOffset);
System.out.println(serverTime);
这会打印
12:00+03:00
由于您的时间格式与 LocalTime
的默认格式 (ISO 8601) 一致,因此我们不需要显式格式化程序。如果您只需要带偏移量的时间表示,那么我们就完成了。如果您需要转换为用户的本地时间,为了可靠地完成此操作,您需要确定时区和日期:
LocalTime clientTime = serverTime.atDate(LocalDate.of(2018, Month.JANUARY, 25))
.atZoneSameInstant(ZoneId.of("Indian/Maldives"))
.toLocalTime();
System.out.println(clientTime);
通过选择的日期和区域,我们得到
14:00
请替换您所需的时区和日期。
假设一下,如果您知道用户与 UTC 的偏移量,则可以使用:
LocalTime clientTime = serverTime.withOffsetSameInstant(ZoneOffset.of("-08:45"))
.toLocalTime();
该示例生成 00:15
。然而,没有人知道政客何时引入夏令时 (DST) 或用户所在时区的其他异常情况,因此我不建议单独依赖偏移量。
是的,我也在使用java.time
。 SimpleDateFormat
不仅已经过时,而且非常麻烦,所以我强烈推荐 java.time
。
关于java - 未指定偏移量如何解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48419684/