使用moment.js和moment-timezone.js时,获取客户端时区并将其转换为其他时区的最佳方法是什么?
我想找出客户的时区,然后将其日期和时间转换为其他时区。
有人对此有经验吗?
Answers:
var timedifference = new Date().getTimezoneOffset();
这将返回客户时区与UTC时间的时差。然后,您可以根据需要使用它。
在使用moment.js时,请使用:
var tz = moment.tz.guess();
它将返回IANA时区标识符,例如America/Los_Angeles
美国太平洋时区。
它记录在这里。
在内部,它首先尝试使用以下调用从浏览器获取时区:
Intl.DateTimeFormat().resolvedOptions().timeZone
如果您只针对支持该功能的现代浏览器,而您不需要Moment-Timezone,则可以直接调用它。
如果Moment-Timezone无法从该函数获得有效结果,或者该函数不存在,则它将通过针对Date
对象测试几个不同的日期和时间来“猜测”时区,以查看其行为。猜测通常是一个足够好的近似值,但不能保证与计算机的时区设置完全匹配。
npm install moment-timezone
则需要像这样window.moment = require('moment-timezone');
当前所有答案均提供当前时间(而不是给定日期)的偏移差异。
moment(date).utcOffset()
以参数传递的日期(或今天,如果没有传递的日期)返回浏览器时间和UTC之间的分钟差(以分钟为单位)。
这是一个在选择的日期解析正确偏移量的函数:
function getUtcOffset(date) {
return moment(date)
.subtract(
moment(date).utcOffset(),
'minutes')
.utc()
}
utcOffset()
,不是offsetUtc()
:)
null
)。
使用Moment库,请访问其网站-> https://momentjs.com/timezone/docs/#/using-timezones/converting-to-zone/
我注意到他们也在自己的网站上使用了自己的库,因此您可以在安装前尝试使用浏览器控制台
moment().tz(String);
The moment#tz mutator will change the time zone and update the offset.
moment("2013-11-18").tz("America/Toronto").format('Z'); // -05:00
moment("2013-11-18").tz("Europe/Berlin").format('Z'); // +01:00
This information is used consistently in other operations, like calculating the start of the day.
var m = moment.tz("2013-11-18 11:55", "America/Toronto");
m.format(); // 2013-11-18T11:55:00-05:00
m.startOf("day").format(); // 2013-11-18T00:00:00-05:00
m.tz("Europe/Berlin").format(); // 2013-11-18T06:00:00+01:00
m.startOf("day").format(); // 2013-11-18T00:00:00+01:00
Without an argument, moment#tz returns:
the time zone name assigned to the moment instance or
undefined if a time zone has not been set.
var m = moment.tz("2013-11-18 11:55", "America/Toronto");
m.tz(); // America/Toronto
var m = moment.tz("2013-11-18 11:55");
m.tz() === undefined; // true