Este es un pequeño error muy pequeño que estoy tratando de corregir en mi código. Tengo un componente React con este estado inicial
const initialFormData = Object.freeze({ date: Moment(new Date()).format('YYYY-MM-DD'), price_per_gallon: '', trip_distance: '', gallons: '', car: '' }); const [formData, updateFormData] = useState(initialFormData);Que se usa en una forma como esta:
<MuiPickersUtilsProvider utils={DateFnsUtils}> <Grid container justifyContent="space-around"> <KeyboardDatePicker fullWidth disableToolbar inputVariant="outlined" format="yyyy-MM-dd" margin="normal" id="date-picker-inline" label="Date of Fillup" name="date" value={formData.date} onChange={handleDateChange} KeyboardButtonProps={{ 'aria-label': 'change date', }} /> </Grid> </MuiPickersUtilsProvider> Hice console.logs para ver que Moment(new Date()).format('YYYY-MM-DD') muestra la fecha de hoy, como quiero, pero por alguna razón, cuando el componente muestra, tiene la fecha predeterminada en el campo como ayer
, pero si tuviera que deshacerme de la inicialización de la fecha con la instancia de Moment y solo hacer que sea 'nueva Fecha ()', se representa correctamente con la fecha de hoy.
¿Alguna idea de por qué podría ser esto? Me estoy destrozando el cerebro aquí, solo quiero que la fecha predeterminada en mi formulario sea el día actual, y necesito formatearlo en AAAA-MM-DD porque así es como mi API envía y recibe los datos.
Editar: aquí hay tres console.logs que he probado:
console.log(new Date()); console.log(Moment(new Date()).format('YYYY-MM-DD')); console.log(Moment().format('YYYY-MM-DD'));y sus resultados:
Wed Feb 09 2022 22:01:41 GMT-0500 (Eastern Standard Time) 2022-02-09 2022-02-09Pero por alguna razón, los dos segundos que usan Moment harán que el componente se muestre con la fecha de ayer.
Primero, puede eliminar el simple JS new Date() como argumento al momento.
date: moment().format('YYYY-MM-DD')No se necesita ningún argumento para que moment tenga un objeto de momento para la hora local. Es el predeterminado ;)
Luego, como se menciona en los comentarios de Vengleab SO, está pasando esa fecha a KeyboardDatePicker que (muy probablemente) asume que es una fecha UTC y "elimina" su compensación de tiempo. Eso explicaría por qué la fecha es ayer cuando se prueba entre las 19:00 y la medianoche (su hora local GMT-5).
Así que... Pasar un tiempo a lo largo de la fecha debería solucionar el problema.
date: moment().format('YYYY-MM-DD 12:00:00')