关于javascript:强制浏览器显示特定时区的所有日期

Force browser to display all dates to specific timezone

本问题已经有最佳答案,请猛点这里访问。

如何强制Browser显示所有date objects以使用Specific Timezone。像传递Europe/London一样。是否有办法这样做?

更新

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


Moment.js是一个很棒的图书馆,可以帮助你实现这一目标。


您无法"设置"时区偏移量,它是基于系统设置的只读属性。

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

例如

1
2
3
4
5
6
7
8
9
10
// 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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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());

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

1
2
3
4
5
d.setOffset(600, 'AEST');
console.log(d.getOffsetFullDate() + ' ' + d.getOffsetTime());

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

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