Tengo algunos problemas con JS Dates.
Estoy pasando una fecha a una función en la que trato de analizarla en un objeto de fecha. Sin embargo, esto no funciona en algunas fechas.
Ejemplo: Paso 31.01.2022 a esta función, creo un nuevo objeto Fecha y establezco Día/Mes, etc. Si imprimo la Fecha después, indica el 3 de enero.
¿Qué me estoy perdiendo aquí?
Código:
const [editedHours, setEditedHours] = useState([]) //ChangeHandler Input Field const postHours = (e, entry_id, index, date) => { let newArr = [...editedHours] newArr[index] = { entry_id: entry_id, date: date, //format dd.mm.yyyy time: e.target.value //format HH:MM } setEditedHours(newArr) } const pushHours = () => { let pushHoursArr = [] for(let i = 0; i < editedHours.length; i++) { let hour = editedHours[i].time.substr(0, 2) //getHour let minute = editedHours[i].time.substr(3, 2) //getMinute let dateStr = editedHours[i].date.split(".") //Split 31.01.2022 const date = new Date(); date.setDate(dateStr[0]) //31 date.setMonth(dateStr[1] -1) //Month 01 -1 since Month starts at 0 date.setFullYear(dateStr[2]) //2022 date.setHours(hour) date.setMinutes(minute) date.setSeconds(0) console.log(date) //prints out Mon Jan 03.... pushHoursArr.push({ entry_id: editedHours[i].entry_id, date: date }) }El problema aquí es el orden de su trabajo:
Primero establece la fecha ahora, pero su fecha existente es hoy (febrero, que solo tiene 28 días)
Entonces, al establecer una fecha del 31 de febrero, se redondea al 3.
const example = '31.01.2022' let dateStr = example.split(".") const date = new Date(); date.setDate(dateStr[0]) date.setMonth(dateStr[1] - 1) date.setFullYear(dateStr[2]) console.log(date)Para mostrar cómo esto afecta el resultado, esto es lo que sucede si configura el año, luego el mes y luego el día:
const example = '31.01.2022' let dateStr = example.split(".") const date = new Date(); date.setFullYear(dateStr[2]) date.setMonth(dateStr[1] - 1) date.setDate(dateStr[0]) console.log(date)La mejor opción es construir la fecha de una sola vez:
new Date(year, month, day, hours, minutes)
const example = '31.01.2022' let dateStr = example.split(".") const date = new Date(dateStr[2], dateStr[1] - 1, dateStr[0]) console.log(date)