我希望用户输入约会日期和时间,并在其前一小时向他发送提醒。
在服务器上我想以UTC格式存储日期时间,但在客户端上,用户将在当地时间输入日期时间。什么是处理这种转换的最佳方式? 是否有一个原生支持它的插件?
答案 0 :(得分:2)
是的,有一个插件根据系统信息(jsTimezoneDetect)检测时区。实际上date
- 对象本身存储了信息(但它有点像wierdo!)。
有一个interesting article和an interesting answer here on SO,值得一读!
不要在javascript中进行任何日期时间计算。你可能猜到了 浏览器时区定义它,但定义本身和所有 日期时间计算必须在时区感知系统中进行。
正如您将阅读本文,您将对javascript中的“date / dst / utc / timezones”问题有更深入的了解 - 因此,如果您告诉我们有关您服务器端的更多信息,那将会很有趣:
“正确”方法(如果后面有后端,则是故障安全的)将是:让用户使用日期时间 - 在浏览器范围内它或多或少“未定义”(无需查找)时区,偏移或任何相似的东西!)。现在,您将此“未定义”日期时间信息提供给服务器(例如,将带有隐藏字段的unix-timestamp发送到服务器),您可以在其中获得用户所分配的实际时区的信息。因此,您现在可以将此“未定义”日期时间信息转换为服务器端的时区感知日期时间对象,并将帐户范围的信息分配给它(现在“未定义”日期时间对象具有本地时间--zone - 例如“太平洋夏令时”)。现在您可以轻松地进行任何所需的转换 这种方法的唯一缺点是,你将有两个定义时区的范围(用户操作系统和你的webapp) - 但其他任何东西都是摆弄而且不是故障安全的!
答案 1 :(得分: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));
Click here使用这个想法做一个简单的测试。