【问题标题】:Set timezone to GB for everyone viewing将时区设置为 GB,供所有人查看
【发布时间】:2016-10-22 17:29:27
【问题描述】:

我有一些代码可以检查用户是否在周一至周五的特定时间(上午 9 点至下午 17 点 30 分)内。

function checkTime() {
    var d = new Date(); // current time
    var hours = d.getHours();
    var mins = d.getMinutes();
    var day = d.getDay();

    return day >= 1
           && day <= 5
           && hours >= 9 
           && (hours < 17 || hours === 17 && mins <= 30);
}

这工作正常,但它会根据用户浏览器时间检查时间。

我想做的是让它检查英国时间上午 9 点至下午 17 点 30 分。

因此,如果您在上午 10 点(UTC-7)从美国查看站点/脚本,您将不在时间检查器范围内,因为它将是英国时间晚上 18 点(UTC+1)。

所以我想我要做的是获取用户时区,然后将其转换为英国时间,然后运行我的 checkTime() 脚本?

【问题讨论】:

  • 相关:stackoverflow.com/questions/1091372/…。棘手的部分是知道英国时间,因为我们全年运行夏令时,因此与格林威治标准时间的差异可能意味着您计算的时间超出 1 小时。我建议您从服务器检索英国时间并在那里检查,而不是捏造客户端解决方案。特别是如果您依赖正确设置的客户端时钟。
  • @RoryMcCrossan: +new Date() 不受夏令时影响,正好返回英国的时间戳……
  • OP 想从客户日期知道英国的时间。您所能得到的只是 GMT 时间(通过减去时区偏移量),而英国在一年中的部分时间运行 BST(即 GMT+1)
  • @RoryMcCrossan:BST 很好,但请记住,所有 Date 值都是 GMT 没有减法,无需担心本地时区,这仅适用于非绑定 toString/toLocaleXXX。 .
  • @BoneStarr - 不,这行不通,因为offset 将是用户的本地时区,不一定是您感兴趣的时区。

标签: javascript jquery date timezone timezone-offset


【解决方案1】:

正如 Rory 在 cmets 中提到的,如果您的参考点是特定时区(在这种情况下为英国时间),那么您将需要逻辑来理解该时区的性质 - 特别是对于有日光的时区保存时间转换,或对其时区偏移的其他更改。

英国当地时间在 GMT (UTC+00:00) 和 BST (UTC+01:00) 之间交替,目前遵循欧盟过渡规则(3 月的最后一个星期日至 10 月的最后一个星期日,两者均在01:00 UTC)。

您当然可以将这些规则硬编码到您自己的逻辑中,但您可能会发现代码过于复杂且难以维护。更好的方法是使用为此目的设计的库。 I list several of them here.

例如,使用 moment-timezone 库,它是流行的 moment.js 库的配套库,您可以简单地执行以下操作:

function checkTime() {

    // now in the UK
    var m = moment.tz("Europe/London");

    // use moment.js getters
    var hours = m.hour();
    var mins = m.minute();
    var day = m.day();

    // your original logic retained
    return day >= 1
           && day <= 5
           && hours >= 9 
           && (hours < 17 || hours === 17 && mins <= 30);
}

【讨论】:

  • 谢谢马特,有道理。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多