【问题标题】:javascript datetimepicker with local support具有本地支持的 javascript datetimepicker
【发布时间】:2012-05-15 15:43:43
【问题描述】:

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

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

【问题讨论】:

标签: javascript date time


【解决方案1】:

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

有一个interesting articlean interesting answer here on SO,值得一读!

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

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

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

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

【讨论】:

  • 有趣的指针。因此,如果我理解正确,我可以将一个隐藏字段发送到服务器,该字段根据用户输入的日期和时间计算从纪元开始的正确毫秒数。一种方法是使用 jsTimezoneDetect 文件添加偏移量。如果我做 new Date(year, month, day, hours, minutes, seconds, milliseconds) 这会自动处理这个问题吗?
  • 其实……是的!我们就是这样做的:让用户例如说'2012-01-01 12:30:00'(好的......正确......不是字符串,而是日期对象)。现在我们将其转换为 unix 时间戳(此转换取决于操作系统设置)并将其发送到我们将其转换的服务器(就像我们在 ASP.NET 上一样)为System.DateTime 并将其设置为“本地”我们从用户她/他自己那里获得的时区信息。现在我们可以转换为真正的 UTC 并进行我们想要的任何转换。如果我们需要显示一些日期时间(它总是以 UTC 存储),我们将转换为显示用户的本地值。
【解决方案2】:

使用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利用这个思路做一个简单的测试。

【讨论】:

  • 这有一个主要问题:如果您在 dst-timezone 您将获得不同日期的不同时区偏移量......例如 2012-01-01 带有 +1,而 2012-05- 07 +2。现在...“+2”可以是带或不带 dst 的时区 ...
  • 顺便说一句 - .getTimezoneOffset() 的结果以分钟为单位
  • @Andreas:尝试我的答案中的链接。客户端向我的服务器发送一个 UTC 时间戳,时间戳由服务器返回并在客户端处理为客户端时区中的日期/时间。
猜你喜欢
  • 2016-10-26
  • 1970-01-01
  • 2015-01-25
  • 2013-04-23
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
相关资源
最近更新 更多