关于日期:具有本地支持的javascript datetimepicker

javascript datetimepicker with local support

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

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


是的,有一个插件可以根据系统信息(jsTimezoneDetect)检测时区。实际上一个date对象本身存储了这些信息(但它有点像wierdo!)。

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

Don’t do any date-time computations in javascript. You may guess the
browsers time zone to define it, but the definition itself and all
date-time computations must be made in a time-zone aware system.

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

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

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


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

1
2
3
4
5
6
7
8
//[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));

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