Почему javascript getMonth count от 0 и getDate count от 1?
Этот вопрос исключительно для удовлетворения моего любопытства.
В объекте Date JavaScript, когда вы вызываете getMonth()
, он возвращает месяц, но он подсчитывается от 0.
0 = January
1 = February
...
Но когда вы вызываете getDate()
, он начинает отсчет с 1
1 = 1
2 = 2
...
Почему непоследовательность?
Ответы
Ответ 1
Я предполагаю это потому, что было бы проще ссылаться в массиве имен, т.е.
var months = ["January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"];
var d = new Date();
var namedMonth = months[d.getMonth()];
Если getMonth()
возвращен 1-12
, тогда программисты должны были бы делать d.getMonth()-1
каждый раз, когда им нужен месяц с именем.
Дни месяца не имеют конкретных "имен" как таковых. getDate()
возвращает 1-(28-31)
. Обычно мы просто ссылаемся на них по их числу, если вы не японцы, но Brendan Eich не является.
То же понятие, что и getMonth()
, применяется и для getDay()
, которое возвращает 0-6
в зависимости от дня недели
var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var namedDay = days[d.getDay()];
Все это возвращает что-то вроде:
console.log("Month: month[" + d.getMonth() + "]: " + namedMonth);
//Month: month[3]: April
console.log("Day: days[" + d.getDay() + "]: " + namedDay);
// Day: days[4] : Thursday
Ответ 2
Если вы хотите сказать это несоответствие - вам нужно спросить у создателя спецификации языка. В соответствии с этим страница JavaScript
основана на ECMAScript
(EDIT: см. Комментарий @MichaelGeary).
И когда вы читаете на странице 165 здесь, вы увидите, что все работает именно так, как оно было разработано.
Для вас это может быть непоследовательность. Для меня это скорее функция - значения, основанные на 0, позволяют сразу обращаться к Array
без выполнения вычислений (см. @Кристофер). В случае дня месяца вы не можете получить доступ к какому-либо Array
. Было бы странно иметь Array
имен дней месяца... вот так:
var namesOfDays = [
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", // and again at least 4 times ...
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday",
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday",
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday",
"Sunday", "Monday", "Tuesday"
]
Ответ 3
Link1
Date.prototype.getDate()
Возвращает день месяца (1-31) на указанную дату в соответствии с местным временем.
Link2
Объект Date содержит число, представляющее конкретный момент в время до миллисекунды Например, если вы укажете 150 секунд, JavaScript переопределит это число как две минуты и 30 секунд.
Когда вы реализуете методы в Javascript, чтобы найти разницу между двумя значениями, указанными в miliseconds, вам нужно будет вернуть date
, который должен быть greater than 0
по понятным причинам.
var startTime = new Date('1/1/1990');
var startMsec = startTime.getMilliseconds();
startTime.setTime(5000000);
var elapsed = (startTime.getTime() - startMsec) / 1000;
document.write(elapsed);
// Output: 5000
Как объясняется "SomeShinyObject", который
var months = ["January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"];
помогает в ссылках на них с помощью индекса массива.
Следовательно, getDay
, getHours
, getMonths
начинается с 0.