首页 > 解决方案 > 如何正确处理服务器端和客户端的节省时间

问题描述

我已经阅读了很多关于时间的内容(增量时间、观察时间、偏移量、时区......)现在我正在使用 Spring 开发一个后端架构,它到了我必须将它们组合在一起的地步。客户端发送和接收带有时间戳和值的 JSON,我可以决定语法应该如何。我不确定星座是否与我计划的方式正确,所以如果您在必要的地方纠正我,我会很高兴。

第一:我如何理解基本概念。

口头禅:始终使用UTC时间。

格式:iso8601 YYYY-MM-DDThh:mm:ss.sTZD(例如 1997-07-16T19:20:30.45+01:00)或 1997-07-16T20:20:30.45Z

TimeZone:例如“Europe/Berlin” 这是时区数据库的 ID,其中定义了区域的特定规则(DST 偏移量..)。

偏移量:告诉您与 UTC 时间的正偏移量或负偏移量。

我的计划: 就我而言,数据可能是在不同的时区进行采样的。在采样过程中更改时区也是可能的。

所以我想在我的mongodb中存储如下数据:

 "TimeStamp": {
                            "StartTime":  "1997-07-16T20:20:30.45Z",
                            "EndTime":  "1997-07-16T20:20:30.45Z",
                            "StartTimeZone":"Europe/Berlin",
                            "EndTimeZone":"Europe/Berlin",
                            "StartTimeOffset": +7,
                            "EndTimeOffset" : +7
                        } 

客户端可以选择一个区间内的数据将被返回。间隔也必须定义为没有偏移的 UTC iso 格式。据我所知,使用 UTC 格式,我可以在日期上执行 $lte 和 $gte 操作来过滤间隔。所以客户端会收到一个带有多个 JSOnObjects 的 JSOnArray。每个对象都有一个值和一个时间戳对象。使用 TimeZone 可以查看数据采样时的偏移量,因此我不必添加偏移量信息,因此可以计算用户的本地时间。但是,如果偏移量发生变化怎么办。我想为此存储偏移量也是有意义的,因此人们也可以重建“旧”时区规则。你认为这是一个很好的解决方案还是我忘记/误解了/可以做得更有效

标签: javamongodbtimetimezoneutc

解决方案


在 Java 中,如果您想谈论某个特定时间点,请使用Instant. 如果 2 个事件发生在不同的时区,但在同一实际时刻,它们的Instant值将是相同的。

如果你想知道那个地区的各种时钟当时说了什么,你需要知道你在哪个时区。例如:

Instant now = Instant.now();  // refers to a point in time, independent of location
LocalDateTime nowHere = now.atZone(ZoneId.systemDefault()).toLocalDate();  // refers to "what the clocks say" at your machine's current timezone
LocalDateTime nowSomewhereElse = now.atZone(ZoneId.of("Timezone string")).toLocalDate();  // same as above, but for somewhere else.

以下 API 是 Java 8 的一部分,与 JPA 和其他常用库/API 完全兼容。如果您只关心事件发生的那一天,则存在等效类。

AnInstant也可以使用instant.toEpochMilli(),instant.getEpochSecond()或转换为时间戳instant.getNano()


推荐阅读