2016-09-30 3 views
0

Я видел, что код-техника, трюк, рубить (как вы хотите назвать его) на: https://codereview.stackexchange.com/questions/142706/take-a-specified-weekday-and-check-if-it-falls-on-the-remaining-days-of-the-cur Просмотр КодаJavaScript - странное использование Date.getDate() для получения количества дней в месяц. Как это работает?

В 6-й строке метод getDate() используется для того чтобы получить количество дней в течение месяца. Месяц, указанный в качестве предыдущего параметра.

Я играл с этим методом, и это, кажется, работает:

var d = new Date(); 
 
    
 
var sep = new Date(d.getYear(), (d.getMonth() + 1), 0).getDate(); 
 
var oct = new Date(d.getYear(), (d.getMonth() + 2), 0).getDate(); 
 
var nov = new Date(d.getYear(), (d.getMonth() + 3), 0).getDate(); 
 
var dec = new Date(d.getYear(), (d.getMonth() + 4), 0).getDate(); 
 
var jan = new Date(d.getYear(), (d.getMonth() + 5), 0).getDate(); 
 

 
console.log(d.toLocaleString('en-US', { month: 'long' })); 
 
console.log('%s %s %s %s %s', sep, oct, nov, dec, jan);

Но как это возможно, что это работает?

Я бы ожидал, что конструктор Date примет только действительные целые числа.

Можно получить любое целое число, которое вам нравится. Это не исключение. НО: Возвращенные значения - это лома.

var d = new Date(); 
 
    
 
var nov = new Date(d.getYear(), (d.getMonth() + 3), 31).getDate(); // November has 30 days. 
 
console.log('%s', nov); // => 31 
 

 
var nov = new Date(d.getYear(), (d.getMonth() + 3), -21).getDate(); // November has 30 days. 
 
console.log('%s', nov); // 9 
 

 
var nov = new Date(d.getYear(), (d.getMonth() + 3), 301).getDate(); // November has 30 days. 
 
console.log('%s', nov); // 27

Может кто-нибудь с некоторыми прозрений объяснить, что там происходит?

ответ

1

Это просто свойство Date класса, как описано на MDN:

Где Дата называется конструктор с более чем одним аргументом, если значения больше, чем их логического диапазона (например, 13 предоставляется как значение месяца или 70 для минутного значения), смежное значение будет скорректировано. Например. новая дата (2013, 13, 1) эквивалентна новой дате (2014, 1, 1), оба создают дату для 2014-02-01 (обратите внимание, что месяц основан на 0). Аналогично для других значений: новая дата (2013, 2, 1, 0, 70) эквивалентна новой дате (2013, 2, 1, 1, 10), которая создает дату для 2013-03-01T01: 10: 00.

Они говорят о значениях, превышающих их логический диапазон, но та же логика применяется для значений ниже их диапазона.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

+0

А, ладно. Я вызываю какую-то «обертку». Правильно? – bew5

+0

Да, это правильно. –

0
var d = new Date(); 

вар = новый ноябрь Дата (d.getYear(), (d.getMonth() + 3), 31) .getDate(); // Ноябрь имеет 30 дней. console.log ('% s', nov); // => 31 Чт 31 декабря 2016 00:00:00 GMT + 0530 (стандартное время Индии)

var nov = new Дата (d.getYear(), (d.getMonth() + 3), -21) .getDate(); // Ноябрь имеет 30 дней. console.log ('% s', nov); // 9 Пн. 09 ноя 2016 00:00:00 GMT + 0530 (стандартное время Индии)

var nov = new Дата (d.getYear(), (d.getMonth() + 3), 301) .getDate(); // Ноябрь имеет 30 дней. console.log ('% s', nov); // 27 Пн. 27 сентября 2017 00:00:00 GMT + 0530 (Стандартное время Индии)