Изменить часовой пояс по умолчанию в JS - PullRequest
3 голосов
/ 28 июля 2011

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;
}

Может быть вызван вместо новой даты (); проблема с ней, она была хорошей, за исключением того, что я хочу получить новую дату (); Но если я хочу передать параметры, так что это большая проблема ... Например, новая дата (год, месяц);

Есть ли у кого-нибудь решение, как в PHP, оно просто влияет на New Date (); сама без изменения функции будет вызвана?

1 Ответ

3 голосов
/ 17 августа 2011

Это печальный вопрос. JavaScript не позволяет вам устанавливать часовой пояс по умолчанию. И JavaScript не облегчает подкласс Date. Вы не можете вызвать конструктор Date как функцию, и если вы создадите Date с любым параметром undefined, вы получите недопустимую дату.

Таким образом, либо вы создаете пользовательскую функцию, как вы, либо создаете пользовательский объект даты и определяете все функции из 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 новых дат, все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...