Javascript 根据用户所在时区转换日期

Javascript 根据用户所在时区转换日期,javascript,timezone,Javascript,Timezone,我想根据他们的时区转换一个日期 例如,我想把它设置在美国东部时间(美国/纽约) 如果用户从美国/洛杉矶访问该网站,则会显示: 2019-04-24 09:00:00 我需要能够返回小时,所以在这个例子中:9 我尝试使用来确定他们的时区,并希望在没有任何运气的情况下处理转换 我是通过在没有任何运气的情况下更改计算机上的时区来进行测试的。您可以保留一个timzeone标识符列表,以及它们相对于您的本地时间的+/-小时数列表(由您的时间函数返回) 一旦你有了一个用户的时区,并且从本地时间戳中提取了当

我想根据他们的时区转换一个日期

例如,我想把它设置在美国东部时间(美国/纽约)

如果用户从美国/洛杉矶访问该网站,则会显示:

2019-04-24 09:00:00
我需要能够返回小时,所以在这个例子中:9

我尝试使用来确定他们的时区,并希望在没有任何运气的情况下处理转换


我是通过在没有任何运气的情况下更改计算机上的时区来进行测试的。

您可以保留一个timzeone标识符列表,以及它们相对于您的本地时间的+/-小时数列表(由您的时间函数返回)

一旦你有了一个用户的时区,并且从本地时间戳中提取了当前小时,只需在列表中查找时区,并使用它的索引访问第二个列表,以查找用户时间的增减时间。


或者您可以使用
getYear
getMonth
getDate
getHours
getMinutes
getSeconds
格式化您自己的日期表示形式。这些方法都根据用户的本地时区返回值。

基于时间转换日期可以这样做。参考示例代码段位于下。
var usaTime=new Date().tolocalstring(“en-US”,{时区:“美国/纽约”});
usaTime=新日期(usaTime);
console.log('USA time:'+usaTime.toLocaleString())
var usaTime=new Date().tolocalstring(“en-US”,{时区:“美国/洛杉矶”});
usaTime=新日期(usaTime);

console.log('USA time:'+usaTime.TOLOCALSTRING())
听起来您要求将特定时区转换为用户的本地时区(无论是什么)。您不需要进行时区检测,但目前确实需要一个库。(建议使用带有时区参数的
toLocaleString
的答案是不正确的,因为该函数将转换为特定时区,但不能转到另一个方向。)

既然您提到了,我将提供一个针对Luxon的具体答案:

luxon.DateTime.fromFormat('2019-04-24 12:00:00',       // the input string
                          'yyyy-MM-dd HH:mm:ss',       // the format of the input string
                          { zone: 'America/New_York'}) // the time zone of the input
              .toLocal()                               // convert to the user's local time
              .toFormat('yyyy-MM-dd HH:mm:ss')         // return a string in the same format

//=>  "2019-04-24 09:00:00"

其他库(如、或)也提供了此功能,但它还不是JavaScript中内置的功能。

我认为这个问题可能需要进一步澄清-我的第一印象是您引用了您已经拥有并从服务器提供服务的日期时间。这个问题不是归结为日期对象是“用户时区感知”的吗?还是不?但它是(确切地说,有些方法是)

您的日期/时间是美国东部时间2019-04-24 12:00:00(我想是下午) 这意味着以毫秒为单位的Unix时间戳是 (我假设4月的白天是开着的,所以不是单纯的东部标准时间,而是东部标准时间和UTC-4:00的偏移量)

当你打电话的时候


console.log(新日期(155612160000).getHours())
JavaScript日期对象不会根据客户端的时区进行时区转换吗?
new Date().getHours()
已经这样做了。问题的第一部分是问如何从表示特定时区(即“America/New_York”)的datetime字符串创建一个
Date
实例吗?关于问题的第二部分,许多JavaScript
Date
方法,如
getHours()
会在本地时间自动返回值,您是否在寻找其他行为?为什么不使用NTP api。网络时间协议,这将始终返回用户在其设备中使用的网络时间,如来自互联网服务提供商或设备中的Sim卡!!!!看一看,;使用NTP的原因如下:用户可能会通过更改设备日期和时间来愚弄应用程序,但NTP将从服务器为用户的特定位置提供时间日期:)Cheesnooo。。。。您不能仅获取
toLocaleString
的输出并将其传递回
日期
构造函数。那是自找麻烦。。。
Date
字符串解析器不需要接受特定于语言环境的格式,输入将被视为位于本地时区。不要这样做。这是一个更好的解决方案。即使不使用库,该要求也已实现。@MattJohnson告诉我为什么这会带来麻烦,告诉我为什么不需要日期字符串解析器来接受本地特定格式?@SachinthaNayanajith据我所知,当您从字符串构造日期时,字符串必须是符合IETF的RFC 2822时间戳或时间戳ISO8601的版本。从这一点上看,toLocalString()的格式似乎没有受到相同的限制-这可能是偶然的结果?正确。所提供链接上的注释解释了原因。规范之外的任何内容都依赖于实现,并且在实现之间可能会有很大的差异。此外,上面代码中的第二行和第三行没有任何意义。第一行很好,已经有了转换后的输出。但是,它没有回答所问的问题,因为这是从本地时间转换到给定时区,OP询问如何以相反的方向转换。抱歉,这种方法不起作用。请阅读中的“时区!=偏移量”部分。这将从UTC转换为本地时间。这不是被问到的。虽然这是正确的,但这不是被问到的。OP没有提供Unix时间戳或任何包含UTC偏移量的输入。他们要求将特定时区转换为用户的本地时间。
Date
对象也不支持时区,但它具有一些利用本地时区的功能(用于输入和输出)。在您的示例中,
Date
对象内部保存的唯一内容是
155612160000
。是
getHours
调用在传递结果之前应用本地时区。更新了答案以反映某些方法是“时区感知的”。我使用Unix时间戳和UTC偏移量作为参考,以正确地放置示例I
var date = new Date(Date.UTC(2012, 11, 12, 3, 0, 0));

// toLocaleString() without arguments depends on the implementation,
// the default locale, and the default time zone
console.log(date.toLocaleString());
// → "12/11/2012, 7:00:00 PM" if run in en-US locale with time zone America/Los_Angeles
luxon.DateTime.fromFormat('2019-04-24 12:00:00',       // the input string
                          'yyyy-MM-dd HH:mm:ss',       // the format of the input string
                          { zone: 'America/New_York'}) // the time zone of the input
              .toLocal()                               // convert to the user's local time
              .toFormat('yyyy-MM-dd HH:mm:ss')         // return a string in the same format

//=>  "2019-04-24 09:00:00"