Советы по работе с 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'));