我有一个日期,我想根据他们的时区进行转换。
例如,我想将其设置为美国东部时间(美国/New_York(
2019-04-24 12:00:00
如果用户从美国/Los_Angeles访问该网站,它将出现:
2019-04-24 09:00:00
我需要能够返回小时,所以在该示例中:9。
我尝试使用 https://github.com/iansinnott/jstz 来确定他们的时区和 https://moment.github.io/luxon,希望处理没有任何运气的转换。
我正在通过更改计算机上的时区进行测试,没有任何运气。
听起来您要求从特定时区转换为用户的本地时区(无论它是什么(。 您不需要时区检测,但目前您确实需要一个库。 (建议将toLocaleString
与时区参数一起使用的答案是不正确的,因为该函数会转换为特定时区,但不能朝另一个方向发展。
既然你提到了Luxon,我就提供一个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"
其他库也提供了此功能,例如date-fns-timezone,js-Joda或Moment-Timezone,但它还没有内置到JavaScript中。
根据时间转换日期可以像这样完成。 引用将日期转换为另一个时区示例代码段位于下。
var usaTime = new Date().toLocaleString("en-US", {timeZone: "America/New_York"});
usaTime = new Date(usaTime);
console.log('USA time: '+usaTime.toLocaleString())
var usaTime = new Date().toLocaleString("en-US", {timeZone: "America/Los_Angeles"});
usaTime = new Date(usaTime);
console.log('USA time: '+usaTime.toLocaleString())
您可以保留 timzeone 标识符的列表及其相对于本地时间的相应 +/- 小时数列表(由您的时间函数返回(。
获得用户的时区后,并且已从本地时间戳中提取当前小时,只需在列表中查找时区并使用它的索引访问第二个列表,以查找要从用户时间中添加或减去的小时数。
> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString
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
或者,您可以使用getYear
、getMonth
、getDate
、getHours
、getMinutes
、getSeconds
来格式化你自己的日期表示形式。 这些方法都根据用户的本地时区返回值。
这个问题可能需要更多澄清 - 我的第一印象是您指的是您已经拥有并从服务器提供的日期时间。这个问题不是归结为Date对象是"用户时区感知"吗?要不?但它是(确切地说,有些方法是(
您的日期/时间是 2019-04-24 12:00:00 EDT(我假设是下午(这意味着以毫秒为单位的Unix时间戳是1556121600000(我假设 4 月的日光是开放的,所以不是纯美国东部标准时间,而是 EDT 和 UTC-4:00 的偏移量(
当您致电时
console.log(new Date(1556121600000).getHours())
这不会像您建议的那样返回 9,对于在具有 PDT 时区的美国/Los_Angeles浏览器上执行的 Javascript?
正如 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getHours 所建议的:
getHours(( 方法返回指定日期的小时, 根据当地时间。