强制浏览器将所有日期显示到特定时区

时间:2013-05-31 12:07:42

标签: javascript html timezone

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

更新

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

e.g。

// 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而不是扩展它。