Часть вашей проблемы здесь:
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>