93

使用 moment.js 和 moment-timezone.js 时获取客户时区并将其转换为其他时区的最佳方法是什么

我想找出客户时区是什么,然后将他的日期和时间转换为其他时区。

有人有这方面的经验吗?

4

7 回答 7

269

使用 moment.js 时,请使用:

var tz = moment.tz.guess();

它将返回 IANA 时区标识符,例如America/Los_Angeles美国太平洋时区。

记录在这里

在内部,它首先尝试使用以下调用从浏览器获取时区:

Intl.DateTimeFormat().resolvedOptions().timeZone

如果您只针对支持此功能的现代浏览器,并且您不需要 Moment-Timezone 进行其他任何操作,那么您可以直接调用它。

如果 Moment-Timezone 没有从该函数获得有效结果,或者该函数不存在,那么它将通过针对Date对象测试几个不同的日期和时间来“猜测”时区,以查看它的行为方式。猜测通常是一个足够好的近似值,但不能保证与计算机的时区设置完全匹配。

于 2016-11-03T16:54:57.920 回答
19
var timedifference = new Date().getTimezoneOffset();

这将返回客户端时区与 UTC 时间的差异。然后,您可以随心所欲地玩弄它。

于 2016-11-03T12:47:38.037 回答
7

所有当前答案都提供当前时间的偏移量差异,而不是在给定日期。

moment(date).utcOffset()返回作为参数传递的日期(或今天,如果没有传递日期) 浏览器时间和 UTC 之间的时间差(以分钟为单位)。

这是一个在选择的日期解析正确偏移量的函数:

function getUtcOffset(date) {
  return moment(date)
    .subtract(
      moment(date).utcOffset(), 
      'minutes')
    .utc()
}
于 2017-11-26T01:22:43.550 回答
5

使用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
于 2019-02-28T13:24:02.763 回答
1

您还可以使用以下 JS 代码获得所需的时间:

new Date(`${post.data.created_at} GMT+0200`)

在这个例子中,我收到的日期是 GMT+0200 时区。取而代之的是每个时区。返回的数据将是您所在时区的日期。希望这可以帮助任何人节省时间

于 2018-05-17T12:35:22.603 回答
0

首先,您可以使用以下命令找出客户端时区

let zoneVal = moment().tz(Intl.DateTimeFormat().resolvedOptions().timeZone).format('Z')

它将返回 GMT 区域格式,例如 +5:30(科伦坡/斯里兰卡和德里/印度)或 +6:00(孟加拉国达卡),具体取决于您所在的地区。

其次,如果您想找出特定时区的时间,请执行以下操作

moment.tz("Asia/Dhaka").format()

它将以 ISO 格式返回达卡的时区值。

于 2022-02-08T08:29:20.980 回答
0

如果用户的时区是你想要的,那么

const localtz = moment.tz.guess() // returns user's timezone

此外,如果您想使用它,那么将时间戳转换为用户时区的最佳方法是

const time = moment.tz(response.timestamp)
const localtz = moment.tz.guess() // user's timezone
const date = time.clone().tz(localtz) // convert time to user's timezone

localtz是用户的时区,使用它我们可以将时间戳转换为用户的本地时间

于 2021-04-02T13:45:33.237 回答