Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有本地支持的javascript日期时间选择器_Javascript_Date_Time - Fatal编程技术网

具有本地支持的javascript日期时间选择器

具有本地支持的javascript日期时间选择器,javascript,date,time,Javascript,Date,Time,我希望用户输入约会日期和时间,并在约会前一小时向他发送提醒 在服务器上,我希望以UTC格式存储日期时间,但在客户端,用户将以其本地时间输入日期时间。处理这种转换的最佳方法是什么? 是否有本机支持此功能的插件?是的,有一个插件可以根据系统信息检测时区()。实际上,date-对象本身存储信息(但它有点像wierdo!) 有一个和,值得一读 不要在javascript中进行任何日期时间计算。你可以猜出答案 浏览器可以定义时区,但定义本身和所有 日期时间计算必须在时区感知系统中进行 在阅读本文时,您将对

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

在服务器上,我希望以UTC格式存储日期时间,但在客户端,用户将以其本地时间输入日期时间。处理这种转换的最佳方法是什么?
是否有本机支持此功能的插件?

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

有一个和,值得一读

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

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

  • 您在服务器端使用哪种框架
  • 您是否有使用某些设置(例如自定义时区设置)表示帐户的逻辑
“正确”的方法(如果您有后端支持,它是故障安全的)将是:让用户使用日期时间-在浏览器范围内,它或多或少是“未定义的”(不需要找到时区、偏移量或任何类似的东西!)。现在,您将这个“未定义”的日期时间信息提供给服务器(例如,将带有hiddenfield的unix时间戳发送给服务器),在服务器上您可以获得用户被分配到的实际时区的信息。因此,您现在可以将此“未定义”的日期时间信息转换为服务器端的时区感知日期时间对象,并将帐户范围的信息分配给它(现在“未定义”的日期时间对象具有本地时区-例如“太平洋夏令时”)。现在,您可以轻松地进行任何转换。

这种方法唯一的缺点是,你将有两个定义时区的范围(用户和你的webapp的操作系统)-但其他任何东西都是摆弄和不安全的

最好向服务器发送时间戳,使用
getTimezoneOffset
方法计算UTC日期/时间客户端。要将其转换回客户端,您需要发送时间戳,创建一个虚拟日期客户端以确定currend时区偏移量(用户可能已移动到另一个时区!),并根据该信息创建客户端日期。客户端您可以执行以下操作:

//[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));
//[客户端发送]
var d=新日期(),//现在
offset=d.getTimezoneOffset()
UTCTimeStamp=d.getTime()+(60000*偏移量);//发送到服务器
//[客户端接收]
var offset=60000*新日期()。getTimezoneOffset(),
localDate=新日期(时间戳+(偏移量<0?数学abs(偏移量):-offset));

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

这可能会有帮助,这有一个主要问题:如果你在dst时区,你会得到不同日期的不同时区偏移。。。例如,2012-01-01带有+1,而2012-05-07带有+2。现在。。。“+2”可以是带或不带dst的时区…顺便说一句,
.getTimezoneOffset()
的结果在minutes@Andreas:请尝试我答案中的链接。客户端向我的服务器发送UTC时间戳,服务器返回时间戳,并处理客户端到客户端时区中的日期/时间。有趣的指针。因此,如果我理解正确,我可以将一个隐藏字段发送到服务器,该服务器根据用户输入的日期和时间计算从epoch开始的正确毫秒数。一种方法是使用jsTimezoneDetect文件添加偏移量。如果我使用新的日期(年、月、日、小时、分、秒、毫秒),这会自动处理offest吗?实际上。。。对我们就是这样做的:让用户说‘2012-01-01 12:30:00’(好的……正确的……不是字符串,而是日期对象)。现在,我们将其转换为unix时间戳(此转换取决于操作系统设置),并将其发送到服务器,在服务器上我们将其转换为
System.DateTime
,并使用用户自己提供的时区信息将其设置为“local”。现在,我们可以转换为真正的UTC,并进行任何转换。如果我们需要显示一些日期时间(总是存储在UTC中),我们将转换为显示用户的本地值。