Подтвердить что ты не робот

Дата Javascript 01.01.10001

Я хочу создать объект Date в javascript, который представляет год 0001, 2014 года назад.

Я пробовал с помощью

d = new Date(); d.setYear(1);
console.log(d);

но он дает 1901 год

с

d = new Date(1,1,1)
console.log(d);

нет.

Как я могу создать эту дату?

4b9b3361

Ответ 1

Прежде всего, это не проблема Y2K вообще! (UPDATE: в некоторых случаях - это связано с проблемами Y2K, но это не проблема)

Правильный ответ: вы не можете сделать это надежно. Является ли летнее время применимым к году 1? Сколько високосных лет было? Были ли они? И т.д. Но ответ от @Daniel будет использовать его!

ОБНОВЛЕНИЕ:, не говоря уже о сообщении @MattJohnson о DST. DST в 1-м году, фактически JS (ES5 в любом случае) будет лежать и использовать текущее правило DST за все годы

Поэтому, пожалуйста, не обманывайте себя идеей о том, что вы можете надежно работать с датами ниже 1970 года. (У вас будет много проблем и сюрпризов даже в этом диапазоне времени.)

Но если вам действительно нужно действительно использовать new Date('0001-01-01') (формат ISO 8601) или @Daniel:

var d = new Date(); d.setFullYear(1);

Но прежде чем использовать его, прочитайте это...


Существует 4 способа создания даты в JS:

new Date()
new Date(milliseconds)
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)

1) новая дата() создает текущую дату (в вашем локальном часовом поясе), поэтому мы пока не заинтересованы в ней.


2) новая дата (число) создает новый объект даты как нулевое время плюс номер. Нулевое время 01 января 1970 00:00:00 UTC.

Итак, в этом случае время в JS рассчитывается с 1970 года.

(new Date(0)).toUTCString()
"Thu, 01 Jan 1970 00:00:00 GMT

Если вы используете отрицательное число, вы можете вернуться назад до 1970 года

(new Date(-62167219200000)).toUTCString()
"Sat, 01 Jan 0 00:00:00 GMT"
-62167219200000             <- milliseconds
-62167219200000 / 1000
-62167219200             <- seconds
-62167219200 / 60
-1036120320             <- minutes
-1036120320 / 60
-17268672             <- hours
-17268672 / 24
-719528             <- days
-719528 / 365
-1971.309589041096 <- years ( this is roughly calculated value )

Проблема в том, что она не надежна. Сколько високосных лет было? Были ли они? Летнее время? И т.д. И мне это не нравится из-за этого волшебного номера -62167219200000


3) новая дата (dateString) Это наиболее "надежный" способ. DateString - строка, представляющая дату RFC2822 или ISO 8601.

RFC2822/синтаксис даты IETF (RFC2822, раздел 3.3), например. "Пн, 25 декабря 1995 года 13:30:00 GMT"

Проблема заключается в том, что если вы используете отрицательное число, вы получите неправильную дату с NaN в результате всех методов

(new Date('01 January -1 00:00:00 UTC')).getFullYear()
NaN

Если вы используете год более высокий или равный 0 и ниже 50, то 2000 будет добавляться автоматически.

(new Date('01 January 0 00:00:00 UTC')).getFullYear()
2000
(new Date('01 January 1 00:00:00 UTC')).getFullYear()
2001
(new Date('01 January 10 00:00:00 UTC')).getFullYear()
2010
(new Date('01 January 01 00:00:00 UTC')).getFullYear()
2001
(new Date('01 January 30 00:00:00 UTC')).getFullYear()
2030
(new Date('01 January 49 00:00:00 UTC')).getFullYear()
2049

И если вы используете год выше или равный 50 и ниже 100, тогда будет добавлено 1900.

(new Date('01 January 50 00:00:00 UTC')).getFullYear()
1950
(new Date('01 January 51 00:00:00 UTC')).getFullYear()
1951
(new Date('01 January 90 00:00:00 UTC')).getFullYear()
1990
(new Date('01 January 99 00:00:00 UTC')).getFullYear()
1999

Годы, равные 100 или выше, получат правильный номер года

(new Date('01 January 100 00:00:00 UTC')).getFullYear()
100
(new Date('01 January 101 00:00:00 UTC')).getFullYear()
101
(new Date('01 January 999 00:00:00 UTC')).getFullYear()
999
(new Date('01 January 9999 00:00:00 UTC')).getFullYear()
9999

Таким образом, мы не можем создать год 1 с использованием синтаксиса даты RFC2822/IETF

О ISO 8601:

http://www.w3.org/TR/NOTE-datetime

Фактические форматы

Year:
      YYYY (eg 1997)
Year and month:
      YYYY-MM (eg 1997-07)
Complete date:
      YYYY-MM-DD (eg 1997-07-16)
Complete date plus hours and minutes:
      YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
Complete date plus hours, minutes and seconds:
      YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
Complete date plus hours, minutes, seconds and a decimal fraction of a second
      YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)

Нас больше всего интересует "Полная дата"

(new Date('0001-01-01')).toUTCString()
"Mon, 01 Jan 1 00:00:00 GMT"

Yahoo!!! (или лучше сказать Google!:)), мы можем использовать ISO 8601 для создания даты с годом 1

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

(new Date('-0001-01-01')).toUTCString()
"Sun, 31 Dec 2000 21:00:00 GMT"
(new Date('01-01-01')).toUTCString()
"Sun, 31 Dec 2000 21:00:00 GMT"
(new Date('02-01-01')).toUTCString()
"Wed, 31 Jan 2001 21:00:00 GMT"
(new Date('02-01-05')).toUTCString()
"Mon, 31 Jan 2005 21:00:00 GMT"

4) новая дата (год, месяц, день, часы, минуты, секунды, миллисекунды)

Чтобы использовать это, вам необходимо передать два параметра (год и месяц), все остальные будут необязательными. Будьте осторожны, потому что здесь месяц начнется с 0 до 11, а не везде. WAT? о_О

ПРЕДУПРЕЖДЕНИЕ! Эта дата будет создана в вашем текущем часовом поясе!!! Поэтому будьте осторожны с этим!

Обновление UPD: by @matt-johnson

... Фактически объект Date всегда отражает локальный часовой пояс. Вы не можете поместить его в другой часовой пояс, и даже если вы инициализируете его временной меткой UTC, он по-прежнему будет отражать локальный часовой пояс в большинстве функций. Внутри он отслеживает UTC числовой меткой времени, и есть функции, которые явно отображают значения UTC, но все остальное является локальным.

Отрицательные числа будут интерпретироваться как отрицательные годы

(new Date(-1, 0)).toString()
"Fri Jan 01 -1 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(-234, 0)).toString()
"Wed Jan 01 -234 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"

Числа от 0 до 99 будут автоматически увеличены на 1900

(new Date(0, 0)).toString()
"Mon Jan 01 1900 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(1, 0)).toString()
"Tue Jan 01 1901 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(11, 0)).toString()
"Sun Jan 01 1911 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(50, 0)).toString()
"Sun Jan 01 1950 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(99, 0)).toString()
"Fri Jan 01 1999 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"

Числа от 100 до 275760 будут интерпретироваться как номера года

(new Date(100, 0)).toString()
"Fri Jan 01 100 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(102, 0)).toString()
"Sun Jan 01 102 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(2002, 0)).toString()
"Tue Jan 01 2002 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"

И число выше 275760 будет недопустимой датой

(new Date(275760, 0)).toString()
"Tue Jan 01 275760 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(275761, 0)).toString()
"Invalid Date"

UPD:

new Date (Date.UTC(1,1,1)) будет более безопасным от тех же симптомов, что и новая дата (год, месяц, день, часы, минуты, секунды, миллисекунды). Из-за функции Date.UTC.

Ответ 2

Используйте setFullYear - это проблема Y2K с JavaScript.

var d = new Date(); d.setFullYear(1);
document.write(d);

Ответ 3

При обработке объектов даты JavaScript вам необходимо указать полный год для ex, 1950, а не 50. Он упоминается в документе. Таким образом, код должен быть таким же, как сказал Даниэль,

d = new Date(); d.setFullYear(1);
console.log(d);

Ответ 4

Метод (устаревший) Date.setYear устанавливает год для указанной даты, но обратите внимание:

Если yearValue - это число от 0 до 99 (включительно), то год для dateObj установлено значение 1900 + yearValue. В противном случае, год для dateObj устанавливается в yearValue.

var theBigDay = new Date();

theBigDay.setYear(96);   // sets year to 1996
theBigDay.setYear(1996); // sets year to 1996
theBigDay.setYear(2000); // sets year to 2000

Вы должны использовать Date.setFullYear метод тем не менее. Другой метод устарел.