Получение разных выводов с помощью getMonth () - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь использовать эту функцию, чтобы проверить, есть ли у пользователя 18 лет или более, но я получаю беспорядочное поведение при использовании getMonth (). то есть, если я поставлю 1, ir вернет 0, но если я поставлю 2, он вернет 2:

function validacion() {
var anio = parseInt($('#year').val()); //year
var mes = parseInt($('#month').val()); //month
var dia = parseInt($('#day').val()); //day
var convertirMes = mes-1;
var ObjFechaFicticia = new Date();
var setearAnioFicticio = ObjFechaFicticia.setFullYear(anio); //year user input
var setearMesFicticio = ObjFechaFicticia.setMonth(convertirMes); //month user input
var setearDiasFicticio = ObjFechaFicticia.setDate(dia); //day user input

var ObjFechaActual = new Date();
var anioActual = ObjFechaActual.getFullYear();
var mesActual = ObjFechaActual.getMonth()+1;
var diaActual = ObjFechaActual.getDate();

console.log("Fecha real: "+diaActual+'/'+mesActual+'/'+anioActual)
console.log("Fecha ficticia :"+ObjFechaFicticia.getDate()+"/"+ObjFechaFicticia.getMonth()+"/"+ObjFechaFicticia.getFullYear())

}

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Часть вашей проблемы здесь:

var ObjFechaFicticia = new Date();
var setearAnioFicticio = ObjFechaFicticia.setFullYear(anio); //year user input
var setearMesFicticio = ObjFechaFicticia.setMonth(convertirMes); //month user input
var setearDiasFicticio = ObjFechaFicticia.setDate(dia); //day user input

Когда вы делаете setYear , если номер дня не существует в том году, в котором установлена ​​Дата, он переносится на следующий месяц, например,

var d = new Date(2016, 1, 29); // 29 Feb 2016
d.setFullYear(2017); 

29 февраля 2017 года нет, поэтому дата переносится на 1 марта. Теперь, когда вы установите месяц, вы получите первое число этого месяца, а не 29, которое вы могли ожидать.

То же самое произойдет с setMonth , поэтому даже если вы перейдете с 31 августа 2018 года на 31 августа 2017 года, если вы затем установите месяц на июнь, он перенесется на 1 июля, и когда Вы устанавливаете дату, которая будет в июле, а не в июне, как вы могли ожидать.

Решение состоит в том, чтобы установить все детали за один раз. И поскольку вам не нужно возвращаемое значение, не храните его:

ObjFechaFicticia.setFullYear(anio, convertirMes, dia);

Теперь у вас возникнет проблема только в том случае, если dia не существует в новом месяце. Надеюсь, вы уже разобрались с этим.

Но вам все равно не нужно использовать методы set , просто передавайте значения непосредственно в конструктор Date:

var ObjFechaFicticia = new Date(anio, convertirMes, dia);

Что позволяет избежать всех этих проблем. Ваш код может быть:

function $(s) {
  return document.querySelector(s);
}

window.onload = function() {
  document.getElementById('calcButton').addEventListener('click', validacion, false);
}

function validacion() {
  var anio = parseInt($('#year').value); //year
  var mes = parseInt($('#month').value); //month
  var dia = parseInt($('#day').value); //day
  var convertirMes = mes-1;
  var ObjFechaFicticia = new Date(anio, convertirMes, dia); //day user input

  var ObjFechaActual = new Date();
  var anioActual = ObjFechaActual.getFullYear();
  var mesActual = ObjFechaActual.getMonth()+1;
  var diaActual = ObjFechaActual.getDate();

  console.log("Fecha real: "+diaActual+'/'+mesActual+'/'+anioActual);
  console.log("Fecha ficticia :"+ObjFechaFicticia.getDate()+"/"+ObjFechaFicticia.getMonth()+"/"+ObjFechaFicticia.getFullYear());
}
Year: <input value="2016" id="year"><br>
Month: <input value="02" id="month"><br>
Day: <input value="29" id="day"><br>
<button id="calcButton">Do stuff</button>
0 голосов
/ 31 августа 2018

это из-за порядка, в котором вы меняете объект даты ... сегодня, 31/8/2018

Допустим, вы хотите поставить дату 4 февраля 2018

const outputDate = d => {
  console.log(`${d.getFullYear()}, ${d.getMonth() + 1}, ${d.getDate()}`);
}
var d = new Date();
outputDate(d); // d is 2018, 8, 31
d.setFullYear(2001);
outputDate(d); // d is 2000, 8, 31 
d.setMonth(1); // set february
outputDate(d); // d is 2000, 3, 3 // 3 is March!!
d.setDate(4);
outputDate(d); // d is 2000, 3, 4 // 3 is March!!
console.log(d+'');

сейчас, если вы измените день, затем месяц, то год

const outputDate = d => {
  console.log(`${d.getFullYear()}, ${d.getMonth() + 1}, ${d.getDate()}`);
}
var d = new Date();
outputDate(d);
d.setDate(4);
outputDate(d);
d.setMonth(1); // set february
outputDate(d);
d.setFullYear(2001);
outputDate(d);
console.log(d+'');

Конечно, вы ДОЛЖНЫ просто сделать

 var ObjFechaFicticia = new Date(anio, convertirMes, dia);

и все будет сладко

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...