0

我希望用户输入约会日期和时间,并在其前一小时向他发送提醒。

在服务器上,我想以 UTC 存储日期时间,但在客户端上,用户将以本地时间输入。处理这种转换的最佳方法是什么?有没有原生支持这个的插件?

4

2 回答 2

2

是的,有一个插件可以根据系统信息(jsTimezoneDetect)检测时区。实际上date-object 本身存储信息(但它有点奇怪!)。

SO 上有一篇有趣的文章一个有趣的答案,值得一读!

不要在 javascript 中进行任何日期时间计算。您可能会猜测浏览器的时区来定义它,但定义本身和所有日期时间计算都必须在时区感知系统中进行。

当您阅读本文时,您将对“javascript 中的 date/dst/utc/timezones”问题有更深入的了解 - 因此,如果您能告诉我们更多有关您的服务器端的信息,将会很有趣:

  • 您在服务器端使用哪个框架?
  • 您是否有任何逻辑可以使用某些设置(例如自定义时区设置)来代表帐户?

“正确”的方法(如果你有后端的话,这是故障安全的)将是:让用户使用日期时间 - 在浏览器范围内它或多或少是“未定义的”(不需要找到时区,偏移量,或任何类似的东西!)。现在您将这个“未定义”的日期时间信息提供给服务器(例如,将带有隐藏字段的 unix-timestamp 发送到服务器),您可以在其中获得用户被分配到的实际时区的信息。因此,您现在可以将此“未定义”日期时间信息转换为服务器端的时区感知日期时间对象,并将您的帐户范围的信息分配给它(现在“未定义”日期时间对象具有本地时间-zone - 例如“太平洋夏令时间”)。现在您可以轻松地进行任何您想要的转换。
这种方法的唯一缺点是,您将有 2 个定义时区的范围(用户的操作系统和您的 web 应用程序) - 但其他任何事情都是摆弄而不是故障安全!

于 2012-05-07T05:08:58.947 回答
0

getTimezoneOffset使用计算 UTC 日期/时间客户端的方法向您的服务器发送时间戳可能是一个想法。要将其转换回客户端,您需要发送时间戳,创建一个虚拟日期客户端以确定当前时区偏移量(用户可能已移动到另一个时区!)并根据该信息创建客户端日期。客户端你会做这样的事情:

//[client side send]
var d = new Date(), //now
    offset = d.getTimezoneOffset()
    UTCTimeStamp = d.getTime()+(60000*offset); // send to server

//[client side receive]
var offset = 60000*new Date().getTimezoneOffset(),
    localDate = new Date(timestamp + (offset < 0 ? Math.abs(offset) : -offset));

点击这里使用这个想法做一个简单的测试。

于 2012-05-07T05:18:25.153 回答