使用moment(timezone).js从用户浏览器获取时区


Answers:


17
var timedifference = new Date().getTimezoneOffset();

这将返回客户时区与UTC时间的时差。然后,您可以根据需要使用它。


47
这将返回当前时区偏移量。不是时区。偏移量可能会根据夏时制等发生变化。请参见时区标签Wiki
Matt Johnson-Pint

9
@MattJohnson的答案是对这个问题的真正答案。从技术上讲,此答案是错误的,因为它与偏移量有关,而不与时区有关(不同的概念)。
dudewad

1
这在Firefox中不起作用,新的Date()在UTC时区中创建了一个日期对象,因此在其上获取getTimezoneOffset()是毫无意义的
KrzysztofKrasoń18年

那么,我们如何在瞬间发挥作用呢?
雷蒙·陈

220

在使用moment.js时,请使用:

var tz = moment.tz.guess();

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

记录在这里

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

Intl.DateTimeFormat().resolvedOptions().timeZone

如果您只针对支持该功能的现代浏览器,而您不需要Moment-Timezone,则可以直接调用它。

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


2
好的答案-赞成!还请使用0.5.4或更高momet-timezone版本...请按照此线程进行进一步的说明github.com/moment/moment-timezone/issues/324
ymz

4
+1。确保您的使用日期和日期可以使用tz钩。momentjs.com/timezone/docs与node.js的安装它使用此命令npm install moment-timezone则需要像这样window.moment = require('moment-timezone');
少年

2
时区是从浏览器还是从设备获取的?
泡沫

2
@bubble -它是从哪个环境代码在执行拍摄
马特·约翰逊品脱

1
@Scaramouche-这与这里的要求无关。请不要束缚于旧评论,而要提出一个新问题。(简短的回答-不,您仍然不能)
Matt Johnson-Pint

6

当前所有答案均提供当前时间(而不是给定日期)的偏移差异。

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

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

function getUtcOffset(date) {
  return moment(date)
    .subtract(
      moment(date).utcOffset(), 
      'minutes')
    .utc()
}

1
该函数实际上是utcOffset(),不是offsetUtc():)
Milkncookiez

2
@Milkncookiez,我更新了答案。谢谢。不知道我如何颠倒它们(这可能是双向工作或在某些先前版本中进行了更改-我发布未经测试的内容的可能性接近null)。
tao

3

使用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

1

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.