【问题标题】:Force browser to display all dates to specific timezone [duplicate]强制浏览器显示特定时区的所有日期[重复]
【发布时间】:2013-05-27 06:04:14
【问题描述】:

如何强制Browser 显示所有date objects 以使用Specific Timezone。就像传递Europe/London。有什么办法吗??

更新

我想要的是所有 Jquery Datepicker 按照特定时区而不是客户端的机器打开日期和时间。

【问题讨论】:

  • 没有。 time zone 由系统提供,是只读属性。但是,您可以为您选择的任何时区生成值。
  • @DevalShah:我不认为 jQuery UI datepicker 不提供这样的选项。还是您使用其他的?

标签: javascript html timezone


【解决方案1】:

Moment.js 是一个很棒的库,可以帮助您实现这一目标。

【讨论】:

  • 你能举个例子吗?我不知道它可以将时区处理为Europe/London
  • 在 dup 链接中查看我关于时刻时区的更新。
  • 我的错误时刻只给你本地和UTC。对不起,我错了,有一个插件,但不确定它的价值:github.com/moment/moment-timezone
【解决方案2】:

您不能“设置”时区偏移量,它是基于系统设置的只读属性。

您可以通过简单地添加客户端时区偏移量,然后添加您想要的任何偏移量来为任何时区偏移量生成时间和日期值(请注意,javascript Date 对象的时区偏移量与通常的值具有相反的意义,因此您添加两者而不是而不是减去一个并添加另一个)。

例如

// Provide offsetInMintes to add to UTC to get required time,
// e.g. Nepal Standard Time is UTC +05:45 -> +345 minutes
function generateOffsetTime(offsetInMinutes) {
  function z(n){return (n<10? '0' : '') + n;}
  var d = new Date();
  d.setMinutes(d.getMinutes() + d.getTimezoneOffset() + offsetInMinutes);
  return [z(d.getHours()),z(d.getMinutes()),z(d.getSeconds())].join(':');
}

alert('The time in Nepal is ' + generateOffsetTime(345));

编辑

您可以将自己的方法添加到 Date.prototype

Date.prototype.setOffset = function(offsetInMinutes, offsetName) {
  this._offsetInMinutes = offsetInMinutes;
  this._offsetName = offsetName;
};

Date.prototype.getOffsetFullDate = (function() {
  var months = ('January February March April May June July ' +
               'August September October November December').split(' ');
  var days = 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday'.split(' ');

  return function() {
    var d = new Date(+this);
    d.setMinutes(d.getMinutes() + d.getTimezoneOffset() + this._offsetInMinutes);
    return days[d.getDay()] + ' ' + d.getDate() + ' ' + months[d.getMonth()] + 
           ', ' + this.getFullYear();  
  }

}());

Date.prototype.getOffsetTime = (function() {
  function z(n){return (n<10? '0' : '') + n;}

  return function() {
    var d = new Date(+this);
    d.setMinutes(d.getMinutes() + d.getTimezoneOffset() + this._offsetInMinutes);
    return z(d.getHours()) + ':' + z(d.getMinutes()) + ':' +
           z(d.getSeconds()) + ' ' + this._offsetName;  
  }  
}());

var d = new Date();
d.setOffset(345, 'NST')
console.log(d.getOffsetFullDate() + ' ' + d.getOffsetTime());

请注意,这会保留日期对象的原始时间值,它会在检索值时调整值,因此可以更改时区以获取同一日期对象的不同值,因此您可以继续:

d.setOffset(600, 'AEST');
console.log(d.getOffsetFullDate() + ' ' + d.getOffsetTime());

d.setOffset(630, 'LHI');
console.log(d.getOffsetFullDate() + ' ' + d.getOffsetTime());

但我仍然认为最好构建自己的日期构造函数,利用内置的 Date 而不是扩展它。

【讨论】:

  • 我们可以使用 Override Javascript 的 Date 属性来指定特定于时区的时间吗? @RobG
  • 你为什么不离开getTimezoneOffset而只使用UTC方法?
  • @DevalShah:不,我们不能(这个答案的第一句话)。如果您的意思是用我们自己的实现覆盖全局 Date 对象 - 我们不应该这样做。
  • 我想你可以替换内置的 Date.prototype.toString 来做任何你想做的事情,但我认为这不是一个好主意。
  • @Bergi——因为那样的话你需要自己计算添加偏移量,而不是让 Date 对象为你做。
猜你喜欢
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 2022-11-19
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
相关资源
最近更新 更多