Советы по работе с Pre-1000 A.D. Даты в JavaScript

Мне любопытно, есть ли у кого-нибудь хорошие решения для точного построения дат до года 1000 A.D. - особенно в годы 1 - 100 н.э.

Например, если я хочу построить дату начала 1-го тысячелетия, я не могу просто сделать...

new Date(Date.UTC(1,0,1,0,0,0,0));

потому что он пытается быть "умным" и предположить, что 1 - 1901, что дает мне...

Sun Dec 31 1900 18:00:00 GMT-0600 (CST)

То же самое касается 99-го года...

new Date(Date.UTC(99,0,1,0,0,0,0));

который становится

Thu Dec 31 1998 18:00:00 GMT-0600 (CST)

Мысли?

Ответ 1

Вот основное решение, с которым я столкнулся. Если дата предшествует 1000 году, я просто добавляю 1000 к ней при построении даты, а затем использую setUTCFullYear() впоследствии.

if (year >= 0 && year < 1000) { 
  var d = new Date(Date.UTC(year + 1000,mon,day,hour,min,sec,0));
  d.setUTCFullYear(d.getFullYear() - 1000); 
  return d; 
}

1000 может быть излишним, так как у меня были проблемы с датами до 100... но что бы то ни было.

Ответ 2

Вы пытались использовать setUTC... функции в объекте даты после его создания?

setUTCDate()
setUTCFullYear()
setUTCMonth()
setUTCHours()
setUTCMinutes()
setUTCSeconds()

Ответ 3

я предпочитаю:

var d = new Date(Date.UTC(year, month, day, hour, min, sec, 0));
d.setUTCFullYear(year);

это всегда работает для всех поддерживаемых значений года.

вызов setUTCFullYear() исправляет преднамеренную ошибку JavaScript, если вы спросите меня.

Ответ 4

Сделайте произвольную дату d и вызовите d.setUTCFullYear(myDate). Кажется, это работает для меня в консоли Chrome.

Ответ 5

Другие указали на исправление. Объект даты javascript был скопирован с Java, так что все его ошибки тоже. Нет никакого значения для Gregorian дат до 1582, так как до этого использовались другие другие календари.

Ответ 6

Это именно то, что Date.UTC и функция конструктора Date (вызываемые с числами как аргументы) должны делать. Простым обходным решением является использование Date.parse, которое не будет применять никаких поправок

new Date(Date.parse('0001-01-04'));
new Date(Date.parse('0001-01-04T18:00:00Z'));