Что возвращает объект Date()?

    new Date(2015, 2)

это март но при вызове

     new Date(2015, 2).getUTCDate()  // 28

кол-во дней возвращает как в феврале, хотя это март, в чем подскажите причина?

new Date(2015, 2)
возвращает тебе 1 марта, 00:00 часов. По UTC это -2 часа, т.е. будет последний день февраля (28) 10 часов вечера.

1 лайк

т. е 28 это кол-во дней в феврале т. к. эта дата относится к февралю(По UTC это -2 часа)?

не количество дней, а именно день, 28-ой последний.
Date возвращает не количество дней в месяце, а именно какую-то дату.

1 лайк

не совсем понял а как тогда корректно обратиться к марту и узнать его последний день?
выходит я обращаюсь к марту

    new Date(2015, 2).getUTCDate() 

а на деле получается последний день февраля
Еще встретил рекомендацию вызывать дату по UTC так:

    new Date(Date.UTC(2015, 2))

не в ней тоже проблема с вызовом метода getUTCDate(), выходит

    new Date(Date.UTC(2015, 2)).getUTCDate() // 1 

почему выражение вычисляется в 1?

как-то так
var month = 0; // January
var d = new Date(2015, month + 1, 0);
alert(d); // last day in January
взято из просторов stackoverflow

смотри, по скольку ты явно не указываешь день, который хочешь получить, оно по умолчанию ставит тебе первое число, по скольку ты явно не указываешь время, которое тебе нужно, оно по умолчанию ставит 12 часов ночи (начало дня)
в итоге у тебя 1 марта 00:00 (начало дня, 1-го марта). По скольку твоя локальная зона отличается от UTC, по UTC у тебя к примеру -2 часа.
http://joxi.ru/Vm6y5YMF3JOQrZ
при вызове .getUTCDate() оно преобразовует твою локальную тайм зону в UTC и отнимает 2 часа. Так и выходит что у тебя не 1-ое марта 00:00, а 28-ое февраля (так как это последний день) 22:00 времени (2 часа до наступления 1-го марта 00:00).

mdn :
Обратите внимание: если функция Date вызывается в качестве конструктора с более чем одним аргументом, то указанные аргументы интерпретируются как локальное время. Если аргументы указывают время в UTC, используйте new Date(Date.UTC(…)) с теми же аргументами.

т.е. оно принимает UTC как твою локальную зону и работает с ней и забивает на твою реальную тайм зону

1 лайк

Да, это самый подходящий способ, но почему он возвращает 1 в случае с

    new Date(Date.UTC(2015, 2)).getUTCDate() // 1 

Это как то связано с количеством дней, если добавить день, то выйдет

    new Date(Date.UTC(2015, 2, 11)).getUTCDate() // 11

здесь ты НЕ указываешь явно день и он берёт первый день.
эквивалент записи

new Date(Date.UTC(2015, 2, 1)).getUTCDate()

здесь ты явно указываешь день и он тебе его возвращает
или в чем вопрос?

Метод getUTCDate() возвращает день месяца указанной даты по всемирному координированному времени.

Нужно кол-во дней в месяце
Использую getUTCDate(),

    new Date(2015, 2).getUTCDate()  // 28

А при utc выходит такое

    new Date(Date.UTC(2015, 2)).getUTCDate()  // 1

вот

var month = 0; // January
var d = new Date(2015, month + 1, 0);
alert(d); // last day in January
взято из просторов stackoverflow

это ведь объект Date, а не последний день месяца

var month = 0; // January
var d = new Date(2015, month + 1, 0).getDate();
alert(d); // last day in January

Да, это делает getUTCDate() и getDate(), мой самый первый вопрос в этом и был, почему результат для обращению к марту возвращает 28 дней словно это февраль?

часовой пояс? как получить правильное кол-во дней?

потому что это и есть февраль

вот :smile:

var month = 0; // January
var d = new Date(2015, month + 1, 0).getDate();
alert(d); // last day in January

1 лайк

Спасибки, работает