使用 REST Api 和 JS 时的时区问题
Time zone issue when using REST Api and JS
我正在使用 FormatJS library along with Handlebars 来显示过去发生的事件列表。我在服务器的 REST API 上调用一个端点,它 returns 我 Json 中的事件列表,每个事件都显示日期时间。 ATM 我正在使用 GMT 时区在数据库中保存日期时间。
所以当我得到我的 Json 时,我是这样处理日期时间的:
{{formatRelative commentDate}}
我的问题是,由于日期时间是以格林威治标准时间存储的,所以它们也这样显示。例如,由于我在 GMT+2 时区,一旦创建新事件并显示在列表中,我就会看到它 "happened 2 hours ago" 而它应该是 "a few seconds ago".
那么,有什么办法可以解决这个问题吗?我在我的数据库中保存格林威治标准时间的日期时间是否有误,如果是这样,您将如何处理来自不同时区的日期时间并将它们显示给其他时区的人?
当然,我可以自定义 formatRelative
助手来使用 getTimezoneOffset
并获得想要的结果,但我想知道是否有更好的方法可以做。
非常感谢!
理解你的问题的关键是你在评论中写的内容:
Getting the Json, containing datetimes in the format 2016-02-28 10:15:53
- that's UTC time
您应确保 JSON 中的值采用完整的 ISO8601 格式,包括适当的偏移量或 Z
字符以指示 UTC:2016-02-28T10:15:53Z
如果没有偏移量,大多数实现会考虑以 当地时间 表示的值,这解释了您的结果。
因此,问题出在您的服务器端代码,而不是您的 JavaScript 代码。当从 JSON 解析日期字符串时,您可以应用客户端解决方法,但实际上最好的解决方案是在服务器上对其进行限定。
我正在使用 FormatJS library along with Handlebars 来显示过去发生的事件列表。我在服务器的 REST API 上调用一个端点,它 returns 我 Json 中的事件列表,每个事件都显示日期时间。 ATM 我正在使用 GMT 时区在数据库中保存日期时间。
所以当我得到我的 Json 时,我是这样处理日期时间的:
{{formatRelative commentDate}}
我的问题是,由于日期时间是以格林威治标准时间存储的,所以它们也这样显示。例如,由于我在 GMT+2 时区,一旦创建新事件并显示在列表中,我就会看到它 "happened 2 hours ago" 而它应该是 "a few seconds ago".
那么,有什么办法可以解决这个问题吗?我在我的数据库中保存格林威治标准时间的日期时间是否有误,如果是这样,您将如何处理来自不同时区的日期时间并将它们显示给其他时区的人?
当然,我可以自定义 formatRelative
助手来使用 getTimezoneOffset
并获得想要的结果,但我想知道是否有更好的方法可以做。
非常感谢!
理解你的问题的关键是你在评论中写的内容:
Getting the Json, containing datetimes in the format
2016-02-28 10:15:53
- that's UTC time
您应确保 JSON 中的值采用完整的 ISO8601 格式,包括适当的偏移量或 Z
字符以指示 UTC:2016-02-28T10:15:53Z
如果没有偏移量,大多数实现会考虑以 当地时间 表示的值,这解释了您的结果。
因此,问题出在您的服务器端代码,而不是您的 JavaScript 代码。当从 JSON 解析日期字符串时,您可以应用客户端解决方法,但实际上最好的解决方案是在服务器上对其进行限定。