#javascript
#javascript
Вопрос:
Сталкиваюсь с проблемой использования Date.UTC(), потому что Date.UTC() автоматически преобразует любой год между 0-99 в 1900-1999, когда мне нужна функция для сохранения исходного года, переданного ей. Я попытался передать строку за год с начальными 0, но у меня все та же проблема.
ОБНОВЛЕНИЕ: Спасибо за ответы, и после прочтения документа MDN я прибегнул к обходному пути, который работает для меня в Chrome и Firefox.
function getUTC(date) {
var year = date.getUTCFullYear();
if (year >= 0 amp;amp; year < 100) {
//calculate the difference in ms between UTC time and local time
var diff = (new Date(0,0,1,0,0,0,0)).getTime() - Date.UTC(0,0,1,0,0,0,0);
//return the local time plus the calculated difference
return date.getTime() diff;
}
return Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds());
}
Более простой способ получить время UTC — присвоить переменной возвращаемое значение .setUTCFullYear(1200,0,1)
или какой .setUTC______()
-либо другой метод.
var date = new Date();
var time = date.setUTCFullYear(1200,0,1)
// time equals -24298834086121
Ответ №1:
Согласно MDN, метод UTC() не поддерживает годы до 100:
Если указан год от 0 до 99, метод преобразует год в год 20-го века (1900 год); например, если вы укажете 95, используется 1995 год.
Вероятно, вам придется указать отдельные компоненты, чтобы вы могли использовать setUTCFullYear() .
var d = new Date(Date.UTC(95, 0, 31, 23, 59, 59));
console.log(d);
d.setFullYear(95);
console.log(d);
Комментарии:
1. В MDN указано, что он поддерживает годы после 1900 года, но он также поддерживает годы до 1900 года, которые я тестировал в консоли Firefox и Chrome. Я понимаю, что мое использование выходит за рамки предполагаемого использования.
2. @b_d Я исправил свое объяснение и добавил доступный для выполнения фрагмент. Я написал это 7 лет назад, поэтому не могу сказать, что я неправильно прочитал документ, в MDN была исправлена опечатка или поведение изменилось.
Ответ №2:
Хотя может быть сложно создать дату за год до 100 года н.э., легко установить существующий объект Date в любой год, включая отрицательные числа для лет до н.э.
Обратите внимание, что только IE включает ‘BC’ в возвращаемую строку и правильно устанавливает годы BC. Вы можете установить год равным 0, который на самом деле не может существовать, в браузерах, отличных от IE, и они включают несуществующий год при добавлении или вычитании лет, которые охватывают даты AD и BC.
IE устанавливает год, присвоенный 0 первому возможному году до 1AD, который равен 1 году до нашей эры.
один BC составляет всего 1 год от одного объявления, а не 2,5 года до того, как одно ОБЪЯВЛЕНИЕ составит пять лет до н.э., а не четыре года до н.э.
function bc(){
var D= new Date(), A= [].slice.call(arguments, 0);
D.setFullYear.apply(D, A);
if(A[0]<= 0 amp;amp;!document.documentMode){
D.setFullYear(D.getFullYear()-1);
}
return D;
}
bc(50, 0, 1, 0, 0, 0, 0).toUTCString() 'nt'
bc(-50, 0, 1, 0, 0, 0, 0).toUTCString()
/*
MSIE 8.0 returns:
Sat, 1 Jan 50 13:41:00 UTC
Sun, 1 Jan 51 B.C. 13:41:00 UTC
Firefox 7.0.1 returns:
Sat, 01 Jan 0050 13:41:35 GMT
Sat, 01 Jan -0051 13:41:35 GMT
Opera 11.51 returns:
Sat, 01 Jan 0050 13:42:11 GMT
Sat, 01 Jan -051 13:42:11 GMT
MSIE 10.0 returns:
Sat, 1 Jan 50 13:42:36 UTC
Sun, 1 Jan 51 B.C. 13:42:36 UTC
Chrome 14.0.835.163 returns:
Sat, 01 Jan 50 13:43:37 GMT
Sat, 01 Jan -51 13:43:37 GMT
Safari 5.1 returns:
Sat, 01 Jan 0050 13:44:07 GMT
Sat, 01 Jan -051 13:44:07 GMT
*/
Ответ №3:
Date.UTC() ограничен диапазоном временных меток unix. По сути, ваш вопрос не имеет смысла, потому что цель UTC — вернуть значение метки времени, которое является количеством секунд с момента «1 января 1970 года»