在JS中默认更改时区

时间:2011-07-28 14:24:55

标签: php javascript date

PHP有一个名为date_default_timezone_set的函数,它会影响GMT,使用Date()命令。

有没有办法影响JS?

我有这个功能:

function calcTime(offset) {
    d = new Date();
    utc = d.getTime() + (d.getTimezoneOffset() * 60000);
    nd = new Date(utc + (3600000*offset));
    return nd;
}

可能会调用New Date();她的问题很好,除了我想得到New Date(); 但是,如果我想传递参数,那么这更多的是一个问题...例如, 新日期(年,月);

有没有人像PHP这样的解决方案只影响New Date();本身没有改变函数被称为?

1 个答案:

答案 0 :(得分:3)

这是一个不幸的问题。 JavaScript不允许您设置默认时区。并且JavaScript不容易将Date子类化。您不能将Date的构造函数作为函数调用,如果使用任何undefined参数创建日期,则会得到无效日期。

因此,要么像你一样创建自定义函数,要么创建create a custom date object and define all the functions from Date

为了向前兼容和简单的代码,这是一个自定义功能解决方案。

(function(){

// Internal timezone settings
var offset_hr = 0;
var offset_ms = 0;

// Get current default timezone in hours
window.getTimezoneOffset = function getTimezoneOffset ( ) { return offset_hr; }

// Set current default timezone in hours
window.setTimezoneOffset = function setTimezoneOffset ( offset ) { 
  offset_hr = offset * 1 ? offset * 1 : 0;
  offset_ms = offset ? offset * 60 * 60 * 1000 : 0;
}

// Create a date with default timezone
window.newDate = function newDate ( year, month, day, hour, min, sec, ms ) {
    // Create base date object
    var d;
    switch ( arguments.length ) {
      case 0 : d = new Date( ); break;
      case 1 : d = new Date( year ); break;
      case 2 : d = new Date( year, month ); break;
      case 3 : d = new Date( year, month, day ); break;
      case 4 : d = new Date( year, month, day, hour ); break;
      case 5 : d = new Date( year, month, day, hour, min ); break;
      case 6 : d = new Date( year, month, day, hour, min, sec ); break;
      case 7 : d = new Date( year, month, day, hour, min, sec, ms ); break;
    }
    // Convert to utc time
    var offset = d.getTimezoneOffset();
    if ( offset || offset_ms ) d.setTime ( d.getTime() + offset * 60 * 1000 + offset_ms );
    return d;
  }
})();

使用示例:

setTimezoneOffset( '+2' );
newDate();
newDate('2011-01-24');
newDate(new Date().getTime());
newDate(2011, 12, 31);
newDate(2011, 12, 31, 12, 34, 56, 789);

只要您不检查新日期的getTimezoneOffset,就可以了。