Date.UTC() для лет между 0-100

#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 года»