【问题标题】:Same datetime across timezones in browser - on a booking engine浏览器中跨时区的相同日期时间 - 在预订引擎上
【发布时间】:2013-04-12 21:27:40
【问题描述】:

我正在寻找在任何浏览器中使用同一时间在国际上预订服务的最佳做法/解决方案。我不太明白逻辑(也在这里挖)。

用例

  • 布鲁塞尔预订的用户可以说位于新加坡的理发服务 - 他将在一周内飞往那里。他在浏览器日期时间控件中选择了 14:00。但是,浏览器设置为 +1 UTC。
  • SG 理发师应将其日程中的时间视为 SG 时间 14:00。
  • 理发店老板正在迪拜旅行,尽管他的浏览器暂时设置为 +4 UTC,但他希望看到他的日程仍然在 SG 时区。

基本上,所有角色都必须在当地时间看到“理发店”,无论他们在哪个 TZ,并在“店”时间向服务器报告。

服务器时间为 UTC,时间戳以 unix 秒为单位。 “商店”TZ 是众所周知的。

问题是我使用了几个在内部使用浏览器本地时间的 jquery 插件(datetimepicker 和日历),并且有几千行代码需要分析和修复,使其不太受支持 - 浏览器在(布鲁塞尔|任何其他TZ)对于每个“新日期()”将获得本地浏览器时间。还有一些狭窄的地方(因为这些想象中的“理发店”遍布全球,并且是从地图上挑选出来的,所以目标 TZ 是动态的)。

通常的做法是什么?

是不是更容易

  • 在不关心时区的 js 中模拟“动态”基准日期,并提供给插件
  • 在加载到客户端时将服务器数据转换为本地 TZ
  • 应用其他解决方案

非常感谢

PS 我已经阅读了best practices - 但正如我所说,我一定会使用特定的插件。

解决方案

我意识到我不需要这些日期时间的相对值,因为我从不需要按时间比较不同“理发店”的书籍(我仍然可以重新计算每个“理发店”的纬度/经度如果需要,相对时间)。

基本上我只需要 absolute UTC 值,无论时区如何,在这种情况下,unix 时间(自 1970 年 UTC 以来的秒数)非常适合。

现在我不是在客户端通过用户浏览器偏移量更正时间,将其发送到后端,然后通过目标偏移量在那里修复它,而是在客户端和服务器/数据库端以明确的 UTC 日期运行整个系统,存储并显示给所有角色,只有日期/时间过滤器例外,它们绑定到本地浏览器时钟而不存储在任何地方。

【问题讨论】:

  • 迈克,感谢您的评论。问题出在客户端;日期字段值在进出浏览器的过程中会经过几层过滤、验证和转换。此外,无论我在服务器端使用什么,无论如何都需要进行客户端转换 - 日期 13-04-2556 是我今天居住的日期,我不是来自未来。

标签: jquery date timezone unix-timestamp


【解决方案1】:

有几种方法可以解决这个问题。

选项 1

  • 忘记 UTC、浏览器的时区和目标时区。只需将它们视为未指定的日期时间。
  • 在服务器和客户端之间,不要传递整数刻度或秒数 - 它们与 UTC 绑定。相反,将本地日期时间作为 ISO8601 字符串传递,不带偏移量或“Z”。
  • 使用moment.js 解析和格式化字符串,而不引入浏览器的偏移量。例如:

    // to get a Date value suitable for use with an existing control or script.
    var date = moment('2013-04-19T14:00').toDate();
    
    // to get a string back from a Date that's ready to go to your server.
    var str = moment(date).format('YYYY-MM-DDTHH:mm');
    
  • 在服务器端,这取决于您所在的平台。可能已经支持 ISO8601。例如,在 .Net 中它只是 .ToString("o")。如果您需要这方面的具体建议,请告诉我们您的服务器平台/语言。

选项 2

  • 使用带有“Z”说明符的 ISO8601 向/从您的服务器传输 UTC 日期时间。
  • 任何时候处理日期,都可以使用 TZDB javascript 库,例如我列出的 here 之一。转换为/从 UTC 和目标时区 - 忽略浏览器的时区。
  • 这可以正常工作,现在您谈论的是特定时刻,而不是某个未指定当地时间。但是,这些库需要大量数据,对于这样一个简单的任务来说,这可能是多余的。我不建议这样做,除非您有许多其他转换要做,例如将约会时间转换为其他时区。

【讨论】:

  • 非常感谢您的详细回答,可惜我还没有足够的业力来投票。邮票在 [0-9]{10},UTC 时间往返。在这种情况下,后端是 php,而 db 是 mysql,但中间有一个 json API 传递并接受 [0-9]{10},所以我必须使用它。这两个选项看起来都很好,我会考虑它们。我刚刚想到的另一个有趣的想法是简单地覆盖 js Date 对象构造函数)谢谢!
  • 抱歉,我对 PHP 格式化字符串不太熟悉。实际 JSON 中的示例日期是什么样的?
  • 那不是 php - 那是正则表达式,意思是 10 位数字,自 1970 年以来以秒为单位的标准 unix 时间。示例是 1365795330。Javascript 有它作为 ms、1365795330 * 1000 或 Date.getTime() / 1000
  • 当您以秒、毫秒或滴答的形式传递日期时 - 这几乎总是从 1970 UTC 开始,因此您必须获取浏览器的偏移量和偏移量考虑到目标区域。我强烈建议您更改 JSON API 以将日期作为日期字符串而不是数字发送。
  • 感谢您的建议!我设法解决了这个问题。我意识到我不需要这些日期时间的 relative 值,因为我从不需要按时间比较不同“理发店”的书籍。所以基本上我只需要 absolute UTC 值,而不管时区如何——猜猜这就是你所说的“未指定”),在这种情况下,unix 时间(自 1970 年 UTC 以来的秒数)非常合适。所以整个系统现在在 UTC 日期运行,存储并显示给所有角色,只有日期/时间过滤器例外,它绑定到本地浏览器时钟。再次感谢! )
猜你喜欢
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 2022-11-19
  • 1970-01-01
相关资源
最近更新 更多