我正在寻找在任何浏览器中使用同一时间在国际上预订服务的最佳实践/解决方案。我不太明白其中的逻辑(也在这里挖掘)。
Use case
- 布鲁塞尔预订的用户假设有一家位于新加坡的理发服务 - 他一周后将飞往那里。他在浏览器日期时间控件中选择 14:00。然而,浏览器设置为 +1 UTC。
- 新加坡理发师应将其议程中的时间视为新加坡时间 14:00。
- 理发店老板正在迪拜旅行,尽管他的浏览器暂时设置为 +4 UTC,但他希望看到自己的议程仍在 SG 时区。
基本上,所有角色都必须看到“理发店”当地时间,无论他们在哪个 TZ,并以“理发店”时间向服务器报告。
服务器时间为 UTC,时间戳以 unix 秒为单位。 “商店”TZ 广为人知。
问题是我使用了几个在内部利用浏览器本地时间的 jquery 插件(datetimepicker 和日历),并且有几千行代码需要分析和修复,这使得它的支持性较差 - (布鲁塞尔|任何其他 TZ)的浏览器每个“new Date()”都会获取本地浏览器时间。还有相当多的狭窄地方(因为这些想象中的“理发店”位于世界各地并且是从地图上挑选的,所以目标 TZ 是动态的)。
对此的常见做法是什么?
是不是更容易
- 在js中模拟“动态”基准日期,不关心时区,并提供给插件
- 加载到客户端时将服务器数据转换为本地 TZ
- 应用其他解决方案
非常感谢
PS我读过最佳实践 https://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices- 但正如我所说,我有点必须使用特定的插件。
SOLUTION:
我意识到我不需要relative这些日期时间的值,因为我从来不需要按时间比较不同“理发店”的书籍(每个“商店”都有纬度/经度,如果需要,我仍然可以重新计算相对时间)。
基本上我只需要absoluteUTC 值与时区无关,在本例中,unix 时间(自 1970 年 UTC 以来的秒数)非常适合。
现在,我在客户端和服务器/数据库端都以明确的 UTC 日期运行整个系统,存储和显示,而不是通过客户端的用户浏览器偏移来纠正时间,将其发送到后端,并通过目标偏移来修复它。适用于所有角色,但日期/时间过滤器除外,它们绑定到本地浏览器时钟并且不存储在任何地方。
有几种方法可以解决这个问题。
Option 1
- 忘记 UTC、浏览器时区和目标时区。只需将它们视为未指定日期时间。
- 在服务器和客户端之间,不要传递整数刻度或秒 - 这些都与 UTC 绑定。相反,将本地日期时间作为 ISO8601 字符串传递,不带偏移量或“Z”。
-
Use moment.js http://momentjs.com/解析和格式化字符串而不引入浏览器的偏移量。例如:
// 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")
。如果您需要这方面的具体建议,请告诉我们您的服务器平台/语言。
Option 2
- 使用 ISO8601 及其“Z”说明符将 UTC 日期时间传输到服务器或从服务器传输 UTC 日期时间。
- 任何时候处理日期时,请使用 TZDB javascript 库,例如我列出的库之一here https://stackoverflow.com/a/15171030/634824。与 UTC 和目标时区之间的转换 - 忽略浏览器的时区。
- 这会很好地工作,现在你谈论的是一个特定的时刻而不是某个时刻未指定当地时间。然而,这些库需要大量数据,对于这样一个简单的任务来说可能有点过分了。我不建议这样做,除非您还有许多其他转换要做,例如将约会时间转换为其他时区。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)