Есть несколько сумасшедших вещей, которые происходят с объектом JS DATE, который преобразует строки, например, рассмотрим следующую дату, которую вы указали
Примечание: следующие примеры могут быть или не быть ОДИН ДЕНЬ ВЫКЛ в зависимости от вашего часового пояса и текущего времени.
new Date("2011-09-24"); // Year-Month-Day
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.
Однако, если мы изменим формат строки на месяц-день-год ...
new Date("09-24-2011");
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.
Еще один странный
new Date("2011-09-24");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF AS BEFORE.
new Date("2011/09/24"); // change from "-" to "/".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.
Мы могли бы легко изменить дефис в вашей дате "2011-09-24" при создании новой даты
new Date("2011-09-24".replace(/-/g, '\/')); // => "2011/09/24".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.
Что если бы у нас была строка с датой, например "2011-09-24T00: 00: 00"
new Date("2011-09-24T00:00:00");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.
Теперь измените дефис на косую черту, как и раньше; что случается?
new Date("2011/09/24T00:00:00");
// => Invalid Date
Обычно я должен управлять форматом даты 2011-09-24T00: 00: 00, так что это то, что я делаю.
new Date("2011-09-24T00:00:00".replace(/-/g, '\/').replace(/T.+/, ''));
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.
ОБНОВИТЬ
Если вы предоставите отдельные аргументы для конструктора Date, вы можете получить другие полезные результаты, как описано ниже
Примечание: аргументы могут иметь тип Number или String. Я покажу примеры со смешанными значениями.
Получить первый месяц и день данного года
new Date(2011, 0); // Normal behavior as months in this case are zero based.
=> // Sat Jan 01 2011 00:00:00 GMT-0700 (MST)
Получить последний месяц и день года
new Date((2011 + 1), 0, 0); // The second zero roles back one day into the previous month's last day.
=> // Sat Dec 31 2011 00:00:00 GMT-0700 (MST)
Пример числа, строковых аргументов. Обратите внимание, что месяц - март, потому что месяцы снова начинаются с нуля.
new Date(2011, "02");
=> // Tue Mar 01 2011 00:00:00 GMT-0700 (MST)
Если мы делаем то же самое, но с нулевым днем, мы получаем что-то другое.
new Date(2011, "02", 0); // again the zero roles back from March to the last day of February.
=> // Mon Feb 28 2011 00:00:00 GMT-0700 (MST)
Добавление нулевого дня к любому аргументу года и месяца приведет к получению последнего дня предыдущего месяца. Если вы продолжите с отрицательными числами, вы можете продолжить откат на другой день
new Date(2011, "02", -1);
=> // Sun Feb 27 2011 00:00:00 GMT-0700 (MST)