2015-03-20 5 views
6

Мне нужен объект js Date с указанными значениями для даты и года. Я ожидал бы new Date("2000-01-01"), чтобы дать мне объект Date с 2000 как значение для getFullYear(), но если настройки моего компьютера установлены на часовой пояс в Чикаго, я получаю Fri Dec 31 1999 18:00:00 GMT-0600 (CST), а для Buenos Aires: Fri Dec 31 1999 22:00:00 GMT-0200 (ARST).javascript Date timezone issue

Есть ли способ создать объект Date, с .getFullYear(), возвращая дату, которую мы установили в конструкторе, независимо от того, какой часовой пояс установлен на пользовательской машине?

Update:. Мне нужна эта дата объект, который будет использоваться в другой библиотеке (который вызывает метод .getFullYear(), поэтому использование UTC добытчиками не помогает

+0

REF для getfullyear_method http://www.thesstech.com/javascript/date_getfullyear_method <тело OnLoad = "date_func();"> –

ответ

13

При разборе строки в Date в JavaScript, значение, которое находится в формате YYYY-MM-DD интерпретируется как UTC значение , а не значения местного времени.

ключ в том, что части отделены дефисом, и что нет никакой информации часового пояса в строке. ECMAScript 5.1 Spec говорит в §15.9.1.15:

... Значение смещения отсутствующего часового пояса - «Z».

Это значит, что если вы не указали смещение, предполагается, что вы имеете в виду UTC.

Заметим, что так как это противоположно тому, что говорит ISO-8601, это поведение было изменено в ECMAScript 2015 (6.0), в котором говорится в §20.3.1.16:

... Если часовой пояс отсутствует, дата-время интерпретируется как местное время.

Поэтому, когда это положение ES6 реализовано правильно, строковые значения этого формата, которые раньше интерпретировались как UTC, будут интерпретироваться как местное время. Я написал об этом here.

Обходной путь прост. Заменить дефис с косой чертой:

var s = "2000-01-01"; 
var dt = new Date(s.replace(/-/g, '/')); 

Другим обходным путем, который является приемлемым, чтобы назначить время полдня вместо полуночи до даты. Это будет проанализировано как местное время, и достаточно далеко, чтобы избежать любых конфликтов ДСТ.

var s = "2000-01-01"; 
var dt = new Date(s + "T12:00:00"); 

В качестве альтернативы рассмотрим библиотеку как moment.js, которая является гораздо более разумным.

var s = "2000-01-01"; 
var dt = moment(s, 'YYYY-MM-DD').toDate(); 
+0

Спасибо! спас мой день! , но откуда взялся трюк с косой чертой? – eagor

+1

Использование слэшей делает его строкой, не совместимой с ISO, которую большинство реализаций интерпретируют как локальное время. Сохранение в формате 'yyyy/mm/dd' вместо' mm/dd/yyyy' или 'dd/mm/yyyy' также помогает устранить региональные проблемы. –

+1

Что делать, если у меня также есть время, например: '" 2015-06-01T11: 31: 01 "'. Любой способ сделать это, не используя moment.js? Thanx – eagor

0

Вы можете написать новый метод «Date.prototype», и использовать его, чтобы получить дату, которая будет в том числе местное смещение часового пояса.

//return the date with depend of Local Time Zone 
    Date.prototype.getUTCLocalDate = function() { 
    var target = new Date(this.valueOf()); 
    var offset = target.getTimezoneOffset(); 
    var Y = target.getUTCFullYear(); 
    var M = target.getUTCMonth(); 
    var D = target.getUTCDate(); 
    var h = target.getUTCHours(); 
    var m = target.getUTCMinutes(); 
    var s = target.getUTCSeconds(); 

    return new Date(Date.UTC(Y, M, D, h, m + offset, s)); 
    };