java - 如何正确处理服务器端和客户端的节省时间
问题描述
我已经阅读了很多关于时间的内容(增量时间、观察时间、偏移量、时区......)现在我正在使用 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 可以查看数据采样时的偏移量,因此我不必添加偏移量信息,因此可以计算用户的本地时间。但是,如果偏移量发生变化怎么办。我想为此存储偏移量也是有意义的,因此人们也可以重建“旧”时区规则。你认为这是一个很好的解决方案还是我忘记/误解了/可以做得更有效
解决方案
在 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()
。
推荐阅读
- python - 如何根据excel的另一列值对列求和
- kubernetes - k8s 我应该向主人或工人发送请求吗?
- go - 函数框架 RegisterCloudEventFunctionContext 与 RegisterEventFunctionContext
- python - Python选择文件夹中最近12小时新生成的文件
- javascript - php电子邮件似乎发送成功但Gmail没有收到
- php - 如何使用 laravel 在 Apiato 中返回分配返回消息?
- python - FileNotFoundError:[Errno 2] 没有这样的文件或目录:'test_text.txt'
- javascript - 通过扩展更改 YouTube 字幕的默认语言
- php - 未经授权访问歌曲文件夹,但可以使用播放器播放
- php - 上传的 UTF-8 编码的 csv 文件在获取内容后有三角形问号字母(捷克字母)