Estoy trabajando en uno de mis problemas de cliente. Cambié la zona horaria de mi sistema a "(UTC-5:00) Hora del Este (EE. UU. y Canadá)". Escribí el siguiente código en mi proyecto:
new Date(year,month.date)
Observé que si el valor del mes es 0 o 1, entonces funciona bien:
new Date(2021,1,21) Sun Feb 21 2021 00:00:00 GMT-0500 (Eastern Standard Time)pero si el valor del mes es mayor que 1, entonces la zona horaria cambiará en 1 hora-
new Date(2021,2,21) Sun Mar 21 2021 00:00:00 GMT-0400 (Eastern Daylight Time)que está causando problema. por favor, alguien sugiera sobre esto por qué está sucediendo y cuál podría ser la solución de esto. la respuesta esperada debe estar en javascript o angular. También se aceptará la biblioteca de momentos. este problema solo es reproducible para algunas zonas horarias. Está funcionando bien para IST.
EMCAScript utiliza la configuración del sistema host para el desplazamiento de la zona horaria. La salida de Date.prototype.toString se basa en esas configuraciones y reglas inferidas para el horario de verano estándar y si se observan.
Dado que una marca de tiempo dice Hora estándar del este y la otra Hora de verano del este, muestra que las fechas se relacionan con las horas en que las reglas de compensación basadas en la configuración regional de su sistema cambian de la hora estándar al horario de verano.
Si solo desea la hora estándar, debe haber una opción en su configuración regional para desactivar la observación del horario de verano. Pero esa será una configuración de todo el sistema y potencialmente afectará las fechas y horas que se muestran en todas partes de su sistema.
De forma alternativa, puede usar toLocaleString con una ubicación que se encuentre en la zona horaria EST de EE. UU. pero que no observe el horario de verano, por ejemplo, América/Panamá. Sin embargo, el formato es diferente al del toString predeterminado. Si desea el mismo formato, deberá construirlo usted mismo, consulte Cómo formatear una fecha de JavaScript
console.log(new Date(2022,1,25).toLocaleString('en',{timeZone:'America/Panama', timeZoneName:'short'}));Tenga en cuenta que esto no tiene ningún efecto en la instancia de Fecha en sí, solo cambia los valores que se muestran cuando se llama a toLocaleString de esta manera.
su fecha está superando el horario de verano de EST
Puede evitar esto especificando la zona horaria de su fecha, por ejemplo:
new Date(2021, 3, 21).toLocaleString('en-GB', { timeZone: 'UTC' }));devolverá la fecha formateada a la cadena de zona horaria UTC en-GB, o puede usar algo como la función Date.UTC para asegurarse de que todas sus fechas se manejen como una zona horaria UTC
Las fechas y horas son un poco una pesadilla en JS: es posible que no solucionen su problema, pero con suerte lo guiarán en la dirección correcta.
Con respecto a los paquetes, si está haciendo mucho trabajo de fecha y hora, sugeriría Moment o los paquetes más pequeños de Luxon, realmente eliminan mucho el dolor de cabeza de las fechas de JS.