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

У метода Date.getMonth() есть ошибка?

Я тестировал хром и firefox, и вот в чем проблема. У метода объекта Date getMonth() есть ошибка? Когда я устанавливаю дату местоположения на someDay, например "2013-1-31"

тогда код js:

var d = new Date();
d.setMonth(8);
d.getMonth();

Результат "9", почему?

Я обнаружил, что если месяц имеет 31 день, запустите метод setMonth, а метод getMonth вернет неправильное значение

почему?

4b9b3361

Ответ 1

Давайте сломаем это:

var d = new Date(); // date is now 2013-01-31
d.setMonth(1);      // date is now 2013-02-31, which is 3 days past 2013-02-28
x = d.getMonth();   // what to do, what to do, 3 days past 2013-02-28 is in March
                    // so, expect x to be March, which is 2

Это только проблема, когда значение дня d больше максимального количества дней в месяце, прошедшем в setMonth(). В противном случае он работает так, как вы ожидали.

Ответ 2

Метод getMonth() возвращает месяц (от 0 до 11) за указанную дату в соответствии с местным временем.

Примечание: январь равен 0, февраль равен 1 и т.д.

Ответ 3

Месяцы в JavaScript представлены от 0-11. Месяц 1 будет февраль, который будет только 28/29 дней, поэтому, когда вы установите месяц на 1, он пытается автоматически скорректировать дату до марта, чтобы сделать дату, которая имеет смысл (с 31-го февраля не имеет смысла). Попробуйте использовать функцию toDateString, чтобы увидеть, что я имею в виду:

 var d = new Date('2013/01/31');
 d.setMonth(2);
 console.log(d.toDateString()); // outputs Match 3rd, 2013

Немного странно, но не багги.

Ответ 4

Метод getMonth() возвращает месяц (от 0 до 11) за указанную дату в соответствии с местным временем, например. Январь - 0, февраль - 1.

Ответ 5

Простейшим решением для этого является добавление второго аргумента в setMonth:

var d = new Date();
d.setMonth(8,1);
d.getMonth(); //outputs 8

http://www.w3schools.com/jsref/jsref_setmonth.asp

Date.setMonth(месяц, день)

день: необязательно. Целое число, представляющее день месяца Ожидаемый значения 1-31, но допускаются другие значения:

0 приведет к последнему дню предыдущего месяца -1 приведет к дню до последнего дня предыдущего месяца. Если месяц имеет 31 день:

32 приведет к первому дню следующего месяца. Если в месяце 30 дней:

32 приведет к следующему дню следующего месяца.

Ответ 6

В javascript месяц начинается с 0. Предположим, сегодня 02/04/2012, когда вы установитеMonth (1), он попытается установить feb. Поскольку максимальный день в feb равен 28/29, он переходит к следующему месяцу (март, который равен 2)

Ответ 7

SetMonth здесь не то, что вы ожидаете, и что происходит в лучших библиотеках. Если вы установите дату 31.x.yyyy на x + 1, возможно, в следующем месяце (x + 1) не будет 31 дня. Так что 31.x + 1.yyyy будет изменено на 1.x + 2.yyyy.

В этом случае месяц будет увеличен на 2 - дата полностью изменилась.

У меня была эта проблема с изменением Февраль- > Март, благодаря Богу это был только тест.

Ответ 8

Это связано с текущей текущей датой , даже если дата, которую вы устанавливаете, находится в прошлом или будущем (при условии, что вы правильно используете диапазон месяцев 0-11). Это происходит потому, что при инициализации Date() используется текущая дата. Когда вы изменяете дату с помощью setFullYear(), setMonth() или setDate(), значения по умолчанию "current" по-прежнему присутствуют и могут сдвигать дату.

Если текущий день месяца (сегодня) составляет 31-е число месяца, а затем вы устанавливаете дату в прошлом, используя setMonth(), setDate(), где месяц меньше, чем ваши текущие 31 день, затем Date ( ) даст вам неправильный месяц, даже если вы конкретно заявите об этом. Это происходит потому, что когда вы устанавливаетеMonth(), текущее значение даты 31, которое не существует в указанном вами месяце, толкает его в следующий месяц. Затем, когда вы устанавливаете дату, месяц никогда не изменяется.

Если вы устанавливаете день месяца до месяца - setDate(), setMonth(), это устраняет проблему, но имеет другую аналогичную проблему/ошибку. Если ваш текущий месяц имеет только 30 дней, а дата, которую вы пытаетесь установить, составляет 31 день, она установит дату месяца как 1, а не 31. Это будет разрешено, если вы установите месяц до дня - setMonth(), setDate(), но затем вы вернетесь к первой проблеме.

Решения:

  • Получить значения, а затем установить день месяца и месяц одновременно (как предложено reetah) - setMonth (8,1)
  • Задайте год с необязательными значениями для инициализации setFullYear (1972, 0, 1), затем установитеMonth, setDate.
  • Установите месяц, установите день, затем убедитесь, что месяц равен тому, что вы установите его и установите снова, если нет - setMonth(), setDate(), setMonth()

function formatDate(date) {
  var monthNames = [
    "January", "February", "March",
    "April", "May", "June", "July",
    "August", "September", "October",
    "November", "December"
  ];

  var day = date.getDate();
  var monthIndex = date.getMonth();
  var year = date.getFullYear();

  return day + ' ' + monthNames[monthIndex] + ' ' + year;
}

var date = new Date();
if (date.getDate() < 31) {
	$("#mydate").text("YOUR LOCAL DATE (on your computer) MUST BE SET TO THE 31st for this bug to show.");
} else {
  date.setFullYear(1972);
  date.setMonth(8); // (month-1)
  date.setDate(24);
  var breakdown = "<br>Day: " + date.getDate() + "<br>Month: " + date.getMonth() + "<br>Year: " + date.getFullYear();
  $("#mydate").html("Set as September (8)<br><br>" + formatDate(date) + breakdown);

  var date = new Date();
  date.setFullYear(1972);
  date.setMonth(8, 24); // (month-1)
  var breakdown = "<br>Day: " + date.getDate() + "<br>Month: " + date.getMonth() + "<br>Year: " + date.getFullYear();
  $("#mydate4").html("Set as September (8) but set day before month<br><br>" + formatDate(date) + breakdown);

  date.setFullYear(1972);
  date.setMonth(9); //October (month-1)
  date.setDate(24);
  var breakdown = "<br>Day: " + date.getDate() + "<br>Month: " + date.getMonth() + "<br>Year: " + date.getFullYear();
  $("#mydate2").html("Set as October (9)<br><br>" + formatDate(date) + breakdown);

  var date = new Date();
  date.setFullYear(1972);
  date.setMonth(7); //Aug (month-1)
  date.setDate(24);
  var breakdown = "<br>Day: " + date.getDate() + "<br>Month: " + date.getMonth() + "<br>Year: " + date.getFullYear();
  $("#mydate3").html("Set as August (7)<br><br>" + formatDate(date) + breakdown);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
September 1972 has only 30 days.  If your current local day is 31, the Date will return October 1972 when you specify September before you specify the day of the month.
<br><br><div id="mydate" style="color: red;">
</div>
<br><br>
<div id="mydate4">
</div><br><br>
<div id="mydate2">
</div>
<br><br>
<div id="mydate3">
</div>

Ответ 9

Я просто решил так:

Пример

var d = new Date('2013/01/31');

m = d.getMonth();

month = m*100/100 + 1;

Var month содержит правильное значение.