如何处理服务器中数据的时区差异,尤其是对于IoT平台



我正在寻找解决方案,如何处理具有特定时间相关数据的数据。

项目体系结构:后端是在Java中建立的宁静服务。

前端是:1. Angular JS(仅适用于网(2.本地移动应用程序(Android,iPhone(。

例如。一台设备在英国(即UTC 1:00(时区,另一个设备是 在HKT(香港I.E. UTC 8:00(时区。

我的服务器在德国(即UTC 2:30(时区。

我应该在服务器上保留什么?

如何在每个设备(Web浏览器和移动设备(上显示当前时间,如果我提供网页,可以从任何地方访问,我应该保留哪个时区值?

当前解决方案:目前,每当数据到达服务器时,我都会保留计算UTC时期的时间并存储它,然后通过休息来发送时间,然后在客户端(Web浏览器或Android设备(中发送时间,我将其转换为本地时区。

这种方法正确吗?

是的,您的方法看起来不错且正确。

用于实现:如果您使用 Java 8 ,请考虑使用新的Java.Time API。它比旧的API容易,更小,并且容易出错。

如果您使用的是 Java< = 7 ,则可以使用Threeten Backport,这是Java 8的新日期/时间类别。对于 android ,有Threetenabp(有关如何在此处使用它的更多信息(。

下面的代码都适用于两者。唯一的区别是软件包名称(在Java 8中是java.time,在Threeten Backport中为org.threeten.bp(,但是类和方法 names> names 是相同的。

要获得UTC时间,您可以使用Instant类。这是最好的选择,因为它始终位于UTC中,并且可以轻松地转换为另一个时区:

// get current UTC time - Instant is always in UTC
Instant instant = Instant.now();
// you can use the string representation
System.out.println(instant.toString());// 2017-06-06T11:57:21.665Z
// or the timestamp (epoch millis - milliseconds from 1970-01-01T00:00:00Z)
System.out.println(instant.toEpochMilli());// 1496750241665
// convert to another timezone (always use valid IDs)
ZonedDateTime z = instant.atZone(ZoneId.of("America/Sao_Paulo"));
System.out.println(z);// 2017-06-06T08:57:21.665-03:00[America/Sao_Paulo]
// in another timezone
z = instant.atZone(ZoneId.of("Europe/Berlin"));
System.out.println(z);// 2017-06-06T13:57:21.665+02:00[Europe/Berlin]
// convert back to UTC Instant
System.out.println(z.toInstant()); // 2017-06-06T11:57:21.665Z

API使用IANA时区名称(始终以Continent/CityAmerica/Sao_PauloEurope/Berlin的格式(。避免使用3个字母的缩写(例如CSTPST(,因为它们是模棱两可的,不是标准的。您可以使用ZoneId.getAvailableZoneIds()获取所有时区名称的完整列表。

您也可以使用ZoneId.systemDefault()获取系统的默认时区。在这种情况下,如果代码在服务器上运行,则将使用服务器的机器时区。如果它在设备中运行,它将使用设备中配置的任何内容。

相关内容

最新更新