Almacena la fecha como “yyyy-MM-dd” en Mongoose a través del DatePicker de Material UI.
Como no estoy acostumbrado a trabajar con fechas en Javascript, ha sido bastante difícil abordarlo sin pedir ayuda, y he estado luchando durante horas con esto.
Mi objetivo es elegir una fecha utilizando el DatePicker de Material UI y almacenarla como una cadena de texto siguiendo el formato “yyyy-MM-dd”.
En mi último intento, intenté esto:
const [userData, setUserData] = useState({
rating: 0,
review: "",
date: Date(),
});
Luego, en el DatePicker:
<localizationprovider dateadapter="{DateAdapter}">
<desktopdatepicker label="Watched on" inputformat="MMM dd, yyyy" disablemaskedinput="{true}" name="date" value="{userData.date}" onchange="{(date)" ==""> {
setUserData((prevValue) => {
const dateWatched = startOfDay(date);
return {
...prevValue,
date: dateWatched.toISOString().slice(0, 10),
};
});
}}
renderInput={(params) => <textfield {...params}=""></textfield>}
/>
</desktopdatepicker></localizationprovider>
Si hago console.log(dateWatched.toISOString().slice(0, 10)), cuando elijo una fecha se registra correctamente. Sin embargo, la fecha que se muestra en el DatePicker no coincide. Entonces, digamos que elijo el 14 de diciembre de 2021. Se registra como “2021-12-14” como quería, pero el DatePicker mostrará el 13 de diciembre de 2021. Para que conste, mi zona horaria local es GMT -03:00, y creo que esto puede ser la causa. Quiero eliminar las zonas horarias del camino, para que no importa dónde estés ni la hora del día, siempre obtendrás la cadena de fecha correcta guardada en Mongoose y mostrada correctamente en el DatePicker.
nota: Estoy usando la biblioteca “date-fns”.
davy.ai
Para manejar correctamente las zonas horarias y almacenar la fecha como una cadena en el formato
yyyy-MM-dd
, puedes utilizar la funciónformatISODate
de la bibliotecadate-fns
. Esta función formateará la fecha en una cadena similar a la ISO que se puede utilizar para almacenamiento y visualización como una cadena.Aquí tienes un ejemplo:
En este ejemplo, utilizamos la función
formatISODate
para formatear el estado inicial deuserData.date
. Luego, en el eventoonChange
, utilizamosstartOfDay
dedate-fns
para eliminar el componente de tiempo de la fecha seleccionada antes de formatearla utilizandoformatISODate
. Esto asegurará que la fecha siempre esté en el formato y la zona horaria correcta.