【问题标题】:Is the client timezone the same as what's specified for the user (javascript / moment.js / moment-timezone.js)客户端时区是否与为用户指定的时区相同(javascript/moment.js/moment-timezone.js)
【发布时间】:2014-10-28 19:56:51
【问题描述】:

我希望能够获取客户端浏览器运行所在的时区,以便将其与用户的本地时区进行比较,我通过“美国/温哥华”之类的配置选项知道该时区。我正在使用 moment.js 和 moment-timezone.js,但我不知道该怎么做!

更新:我真的不需要客户端的时区来获得我想要的功能 - 我只需要知道它是否与我在配置选项中指定为用户的时区不同。我已经找到了解决这个问题的方法,它不需要加载一个全新的库,如下所示。

(已更新问题以使其更清晰。)

【问题讨论】:

  • 但是用户是客户..所以我认为您正在尝试比较同一件事..不​​是吗?
  • 有一个open issue 用于获取用户的当前时区,所以我认为目前使用momentjs 是不可能的。我会看一下提议的副本——我在 jstz 上取得了成功。
  • 谢谢安德鲁!我能够找到我在下面发布的有效解决方案,而无需加载另一个库(例如 jstz)。注意,我不需要知道客户端浏览器时区,我只需要知道它是否与用户指定的不同。

标签: javascript momentjs timezone-offset


【解决方案1】:

我不确定“客户端的浏览器”和“用户的时区”有什么区别?

您可以使用以下方法在几分钟内获取当前用户与 GMT 的时区偏移:

moment().zone();

moment.js docs Timezone Offset

【讨论】:

  • 对不起,我的“用户时区”是他居住的固定时区,例如America/Vancouver。 “客户端浏览器时区”是指客户端浏览器运行的时区。想想一个世界旅行者。我想知道他是否远离家乡时区。
【解决方案2】:

我醒来时得到了一个有效的答案:

function awayFromHomeTZ(tz) {
    var there = moment.tz(tz);
    var here = moment();
    var thereHHMM = there.hour() * 60 + there.minute();
    var hereHHMM = here.hour() * 60 + here.minute();
    return Math.abs(thereHHMM - hereHHMM) > 59;
}

小提琴:http://jsfiddle.net/0418th02/4/

【讨论】:

    【解决方案3】:

    你不需要时间来做这件事,它是一个原生的 javascript 函数:

    var offset = new Date().getTimezoneOffset();

    然后您只需将来自客户端的偏移量(“客户端时区”)与来自服务器的偏移量(“用户时区”,假设以某种方式存储在数据库或配置文件中)进行比较,并在调整演示文稿中的日期时间值时应用差异层(例如;您还可以将此与通常将日期显示本地化为客户/用户的文化相结合)。

    示例:

    如果您的客户端 TZ 偏移量是 -480(-8 GMT,又名“PST”),而您的服务器 TZ 偏移量是 -8,则在显示来自服务器的调整后时区相关数据时,它们会相互抵消。请注意,“服务器时区”也可以指应用程序中已知用户的时区,然后只需将该区域的时区偏移量与客户端 TZ 偏移量进行比较。

    使用原生 JS 的小提琴: http://jsfiddle.net/34qfwf1y/1/

    代码:

    // client TZ (offset from GMT)
    var clientTZOffset = new Date().getTimezoneOffset() * -1;
    
    // user home TZ from server (faked here; pretend you got it from server and passed it to js)
    // pretend user's home is in Los Angeles (using Pacific Daylight Time since it is 28 October 2014 today)
    var User = {
        Profile: {
            TimeZoneOffset: -420
        }
    }; // server is GMT -7
    
    var origDate = new Date();
    var diff = User.Profile.TimeZoneOffset - clientTZOffset;
    var clientTZHoursFromGMT = clientTZOffset / 60;
    var homeTZHoursFromGMT = User.Profile.TimeZoneOffset / 60;
    var adjDate = new Date(origDate.getTime() + diff*60000);
    
    document.getElementById('isHomeTZ').innerHTML = (clientTZHoursFromGMT===homeTZHoursFromGMT).toString().toUpperCase();
    document.getElementById('originalDate').innerHTML = origDate.toString();
    document.getElementById('adjustedDate').innerHTML = adjDate.toString();
    document.getElementById('homeTZ').innerHTML = homeTZHoursFromGMT.toString();
    document.getElementById('clientTZ').innerHTML = clientTZHoursFromGMT.toString();
    Client is in user's home time zone (PDT):
    <div id="isHomeTZ"></div>
    <br/>Original date (ignore TZ display, pretend it is PDT / Los Angeles):
    <div id="originalDate"></div>
    <br/>Saved User's Home TZ (simulated; in hours from GMT)
    <div id="homeTZ"></div>
    <br/>Client TZ (in hours from GMT)
    <div id="clientTZ"></div>
    <br/>Adjusted date (in client timezone)
    <div id="adjustedDate"></div>

    【讨论】:

    • 我坐在 EDT 的这里,您的代码正在警告 TRUE。另外,谢谢,但我的网络服务器上的时间不相关。
    • 这不是关于网络服务器上的时间,而是关于用户的“家庭”时间如果保存在用户的配置文件中可能来自网络服务器的概念 - 但您没有指定用户的家庭 TZ 来自哪里在你的问题中,所以我只是用一种常见的方法来填补空白。
    • 感谢您的尝试。我无法让您的代码工作,我想出了如何做到这一点 - 我发布了一个答案并在我的 WebApp 中实现了它。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2013-01-12
    • 2021-09-07
    • 2012-02-08
    • 1970-01-01
    • 2013-10-30
    • 2022-01-21
    相关资源
    最近更新 更多