浏览器中跨时区的相同日期时间 – 在预订引擎上

我正在寻找在国际上预订服务的最佳实践/解决方案,在任何浏览器中使用相同的时间。 我不太了解逻辑(也在这里挖掘)。

用例

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

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

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

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

通常的做法是什么?

它更容易吗?

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

非常感谢

PS我已经阅读了最佳实践 – 但正如我所说,我有点必须使用特定的插件。

解决方案

我意识到我不需要这些日期时间的相对值,因为我从不需要按时间比较不同“理发店”的书籍(每个“商店”都有lat / lng我仍然可以根据需要重新计算相对时间)。

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

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

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

选项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

  • 使用ISO8601及其“Z”说明符将UTC日期时间传输到服务器或从服务器传输。
  • 每次使用日期时,请使用TZDB javascript库,例如我在此处列出的库之一。 转换为UTC和目标时区 – 忽略浏览器的时区。
  • 这将工作得很好,现在你谈论的是一个特定的时刻,而不是一些未指定的当地时间。 但是,这些库需要大量数据,这对于这样一个简单的任务来说可能有点过分。 除非您还有许多其他转换要做,例如将约会时间转换为其他时区,否则我不建议这样做。