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

Почему javascript getMonth count от 0 и getDate count от 1?

Этот вопрос исключительно для удовлетворения моего любопытства.

В объекте Date JavaScript, когда вы вызываете getMonth(), он возвращает месяц, но он подсчитывается от 0.

0 = January
1 = February 
...

Но когда вы вызываете getDate(), он начинает отсчет с 1

1 = 1
2 = 2
... 

Почему непоследовательность?

4b9b3361

Ответ 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.