java - 未指定偏移量如何解析?

标签 java time timezone-offset datetime-parsing

我的时间为 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.timeSimpleDateFormat 不仅已经过时,而且非常麻烦,所以我强烈推荐 java.time

关于java - 未指定偏移量如何解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48419684/

相关文章:

java - 带下划线的 RegEx 验证名称

java - 无法将套接字设置为非阻塞

javascript - 在 JavaScript 中获取客户端的 GMT 偏移量

PHP 转换时间格式并添加随机时间变量

python - 如何在 python 和 django 中使用 Pytz 根据给定的 UTC 偏移量转换数据和时间?

java.time.format.DateTimeParseException : when trying to parse timezoned datetime

java - Excel 在生成的 CSV 文件中未正确显示欧元符号

JavaScript 和动态表单创建

c++ - Visual Studio 2012 编译时间慢

Java - 12 小时到 24 小时格式 (hackerrank)