我正在尝试使用此函数来验证用户是否有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())
}
答案 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>