Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.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_Ajax_Timezone - Fatal编程技术网

在Javascript中使用除浏览器区域以外的时区

在Javascript中使用除浏览器区域以外的时区,javascript,ajax,timezone,Javascript,Ajax,Timezone,我有一个页面,允许用户查看和编辑存储在数据库中的时间(带有日期)。时间以UTC格式存储在数据库中,并附加到具有不同时区的位置。当用户查看时间时,他们显示在附加的时区中,而不一定显示在浏览器的时区中。然后,用户应该能够编辑time和make以及AJAX请求。我需要能够在javascript中将输入的时间从任意时区转换为UTC,但javascript似乎只允许从浏览器时区转换为UTC。在javascript中传递绝对偏移量是行不通的,因为用户应该能够在夏时制之前或之后编辑时间。这似乎是一个以前解决过

我有一个页面,允许用户查看和编辑存储在数据库中的时间(带有日期)。时间以UTC格式存储在数据库中,并附加到具有不同时区的位置。当用户查看时间时,他们显示在附加的时区中,而不一定显示在浏览器的时区中。然后,用户应该能够编辑time和make以及AJAX请求。我需要能够在javascript中将输入的时间从任意时区转换为UTC,但javascript似乎只允许从浏览器时区转换为UTC。在javascript中传递绝对偏移量是行不通的,因为用户应该能够在夏时制之前或之后编辑时间。这似乎是一个以前解决过的问题。。。有什么指示吗?

我认为您不必在浏览器上进行时区转换。您可以在客户端上显示一个“不透明”的日期时间,让他们修改它,然后根据需要发布到服务器以将其转换为UTC。

不确定我是否应该将此作为答案,但我不能留下评论,因为我没有将该临时帐户与此ID关联


不幸的是,在服务器端进行时区计算似乎是唯一干净的方法,但是我仍然希望有人能找到另一种解决方案。按照惯例,此代码中的所有时间都应以UTC发送,如果可能的话,我希望避免打破该惯例(并在其他地方使其混淆,我们可能会使用服务调用)。

这是一个极其棘手的问题。只要用户在他/她自己的时区(或格林尼治标准时间)内看到所有时间,您就不会有问题。但要求JS为不同地区提供准确的当地夏时制时间值是令人讨厌的事情。浏览器可以知道格林尼治标准时间和当地时间(多亏了操作系统),还可以知道DST何时在当地启动。但是如果不改变用户的系统时区信息,JS就无法判断DST何时在另一个地区启动。DST何时生效的规则不仅因国家而异,而且随着时间的推移,日期可能会发生意外变化(还记得北美国家最近何时移动DST日期吗?)。您可能可以非常容易地找出服务器上的区域设置DST详细信息,并将其与浏览器进行通信。但完全在浏览器中进行尝试可能并不实际。在应用程序中可以有一种DST_转换_by_语言环境数组,但需要定期更新

[编辑]关于JS Date对象在时区中的工作方式,似乎有些混乱。以下是一些有用的观点:

时区偏移 将日期解析为本地时间 时间标记
在大多数情况下,时区存储为用户首选项。然后,此偏移量应用于服务器并显示在页面中。我认为没有像window.browser.timezone这样的javascript对象,它将返回GMT和用户计算机之间的差异(以分钟为单位):
dt=new Date();警报(dt.getTimezoneOffset())
它也支持DST,因此如果您居住在有DST的地区,以下将返回不同的值:
警报((新日期('2010年1月1日12:00:00 GMT-0000'))。getTimezoneOffset())
警报((新日期('2010年7月1日12:00:00 GMT-0000'))。getTimezoneOffset())
// Create a time in winter (Standard time)
dt = new Date('Jan 1 2010 12:00:00 GMT-0000'); 
alert(dt.getTimezoneOffset()); 
// In Japan right now, users would see "-540"
// In New York right now, users would see "300"

// Create a time in summer (DST)
dt = new Date('Jul 1 2010 12:00:00 GMT-0000'); 
alert(dt.getTimezoneOffset()); 
// In Japan right now, users would see "-540"
// In New York right now, users would see "240"
// NOTE: Japan has no DST while NY does
// The following will all return the same time string, which will be 
// the time according to the user's OS time settings and locale
alert((new Date('Jun 25 2010 13:30:00 GMT-0230'))); // Newfoundland time
alert((new Date('Jun 25 2010 13:00:00 GMT-0300'))); // Atlantic time
alert((new Date('Jun 25 2010 12:00:00 GMT-0400'))); // Eastern time
alert((new Date('Jun 25 2010 11:00:00 GMT-0500'))); // Central time
alert((new Date('Jun 25 2010 10:00:00 GMT-0600'))); // Mountain time
alert((new Date('Jun 25 2010 9:00:00 GMT-0700'))); // Pacific time
// If you don't want to work with strings, use numbers instead. 
// These return the JS timestamp for the same values above. 
// The value is a *delta*, so it is unaffected by DST.
alert((new Date('Jun 25 2010 13:30:00 GMT-0230')).getTime()); // Newfoundland time
alert((new Date('Jun 25 2010 13:00:00 GMT-0300')).getTime()); // Atlantic time
alert((new Date('Jun 25 2010 12:00:00 GMT-0400')).getTime()); // Eastern time
alert((new Date('Jun 25 2010 11:00:00 GMT-0500')).getTime()); // Central time
alert((new Date('Jun 25 2010 10:00:00 GMT-0600')).getTime()); // Mountain time
alert((new Date('Jun 25 2010 9:00:00 GMT-0700')).getTime()); // Pacific time