【问题标题】:Get timezone from users browser using moment(timezone).js使用 moment(timezone).js 从用户浏览器获取时区
【发布时间】:2017-03-17 00:57:57
【问题描述】:

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

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

有人有这方面的经验吗?

【问题讨论】:

标签: javascript momentjs angular-moment


【解决方案1】:

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

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是用户的时区,使用它我们可以将时间戳转换为用户的本地时间

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 函数其实是utcOffset(),不是offsetUtc() :)
    • @Milkncookiez,我更新了答案。谢谢你。不知道我是如何颠倒它们的(这可能是双向工作或在某些先前版本中被更改的情况 - 我发布未测试的东西的可能性接近 null)。
    【解决方案3】:
    var timedifference = new Date().getTimezoneOffset();
    

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

    【讨论】:

    • 返回当前时区偏移量。不是时区。偏移量可以根据夏令时等因素进行更改。请参阅the timezone tag wiki中的“时区!= 偏移量”
    • @MattJohnson 的回答是这个问题的真正答案。从技术上讲,这个答案是不正确的,因为它与偏移量相关,而不是与时区相关(不同的概念)。
    • 这在Firefox中不起作用,new Date() 在UTC时区创建一个日期对象,所以在它上面getTimezoneOffset()是没有意义的
    • 那么我们如何使用它呢?
    【解决方案4】:

    使用 moment.js 时,使用:

    var tz = moment.tz.guess();
    

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

    documented here

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

    Intl.DateTimeFormat().resolvedOptions().timeZone
    

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

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

    【讨论】:

    • 很好的答案 - 赞成!也请使用momet-timezone 版本0.5.4 或更高版本...请关注此线程以获得进一步的解释github.com/moment/moment-timezone/issues/324
    • +1。确保您使用日期的时刻以利用 tz 钩子。 momentjs.com/timezone/docs 用 node.js 安装它使用这个命令npm install moment-timezone 然后像这样需要它window.moment = require('moment-timezone');
    • 时区是取自浏览器还是设备?
    • @bubble - 它取自代码执行的任何环境。
    • @Scaramouche - 这与这里的问题无关。请不要链接到旧的 cmets,而要提出一个新问题。 (简短的回答 - 不,你仍然不能)
    【解决方案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
    

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 2016-07-17
        相关资源
        最近更新 更多