【发布时间】:2011-06-21 16:23:10
【问题描述】:
我的单页 javascript 应用程序通过 REST 调用以 JSON 格式检索数据。日期使用标准 ISO8601 格式的 UTC 时区格式化,例如2011-02-04T19:31:09Z。
注册服务时,用户从下拉列表中选择他们的时区。此时区可能与用户浏览器的时区不同。 javascript 应用程序始终知道用户选择的时区。
我知道如何将 UTC 字符串转换为日期。我了解 Javascript 仅代表本地时区的日期。
但我无法弄清楚如何显示针对用户本地时区以外的时区格式化的日期。它必须考虑所有日期的 DST。在内部,我想将所有日期作为 UTC 处理,并且只在显示时转换为另一个时区中日期的字符串表示形式。我需要在用户个人资料中选择的时区显示日期,而不是他们浏览器的时区。
我已经尝试使用服务器发送用户浏览器时区和用户配置文件时区之间的时区偏移差异(以毫秒为单位)。但我发现我不能只发送一个偏移量值,而是需要为每个日期发送一个偏移量以说明 DST 的变化。
关于如何显示不同时区格式的日期的任何建议或示例代码?到目前为止我发现的选项:
- 服务器将日期作为已在正确时区格式化的字符串发送,并且没有在客户端上进行日期解析或操作。这使得在客户端上做某些事情即使不是不可能也很困难。
- 使用诸如https://github.com/mde/timezone-js 之类的库,它将整个Olson TZ 数据库包含到Javascript 中。这意味着更长的加载时间更多的内存使用等。
- 发送一个 timezoneOffsetMillis 值,每个日期都发送给客户端。这会导致混乱的 JSON 数据和非最佳 REST 接口。
有没有更简单或更好的解决方案?
【问题讨论】:
-
它可能在您的应用程序中不起作用,但在网络上,显示某物的年龄通常更容易,而不是尝试在用户时区中可靠地显示日期和时间。例如,SO 上的“6 分钟前询问”。
-
@Alexandre -- 谢谢,我已经在可能的情况下这样做了,例如上次登录日期、发布日期等。但是我的应用程序需要显示发生在各种事件中的特定日期和时间时区。我不能为此使用相对时间或年龄。
-
我肯定会选择 timezone-js,这将是“正确”的做法。您还可以将其与以下时区检测脚本结合使用:bitbucket.org/pellepim/jstimezonedetect。
-
@Jon,我同意这是正确的方法,但它肯定会增加一些臃肿。我希望 JS 从一开始就支持时区。感谢指向 jstimezonedetect 的指针。我以前看过它的演示页面,但忘记了。
-
在这种情况下,我会使用 zoneinfo 文件将 tz 工作卸载到服务器,并让它通过格式化的 json 返回本地日期时间。
标签: javascript datetime timezone utc dst