使用getMonth()获得不同的输出

时间:2018-08-31 01:11:45

标签: javascript validation date object

我正在尝试使用此函数来验证用户是否有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 :(得分:1)

这是因为您更改日期对象的顺序...今天,31/8/2018

让我们说您想输入2018年2月4日的日期

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);

一切都会好起来

答案 1 :(得分:0)

部分问题在这里:

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); 

2017年2月29日没有,因此该日期将延续到3月1日。现在,当您设置月份时,您将获得该月的第一天,而不是您可能一直期望的29日。

setMonth 也会发生同样的事情,因此,即使您从2018年8月31日到2017年8月31日,如果您将月份设置为6月,它将延续到7月1日,并且您将日期设置为7月,而不是您预期的6月。

解决方案是一次性设置所有零件。而且由于您不需要返回的值,所以请不要存储它:

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>