Estoy tratando de encontrar la mejor manera en JavaScript para obtener el día de la semana de una fecha particular en cualquier zona horaria, dada solo una cadena de fecha.
Específicamente, si tengo una cadena de fecha como:
2022-01-29 Y creo un nuevo objeto Date en JS con esa cadena, y luego llamo al método getDay en el objeto Date, porque estoy en la zona horaria "America/New_York", en realidad obtengo el día de la semana para el día anterior esa fecha, no el día de la semana de la fecha en sí.
Esto se puede demostrar fácilmente para cualquier persona en una zona horaria que sea menos UTC (por ejemplo, Estados Unidos, Canadá, etc.) ejecutando:
new Date('2022-01-29').getDay() que debería devolver 6 para el sábado, pero debido al cambio de zona horaria, obtengo 5 para el viernes.
Encontré "https://stackoverflow.com/a/39209842/128421", que recomendaba usar el método getTimezoneOffset como:
var date = new Date('2016-08-25T00:00:00') var userTimezoneOffset = date.getTimezoneOffset() * 60000; new Date(date.getTime() - userTimezoneOffset);Eso parece funcionar, pero un par de puntos:
- userTimezoneOffset al final, pero solo funciona para mí con + userTimezoneOffset . ¿Por qué?¿Cuál es la mejor manera de obtener el día de la semana en JavaScript cuando todo lo que tengo es una cadena de fecha?
Usar
new Date('2022-01-29').getUTCDay() new Date('2022-01-29') creará un objeto Date con la fecha UTC (Greenwhich) "2022-01-29" y la hora "00:00h". Al obtener un día de la semana con .getDay() , su navegador lo calculará para su zona horaria local . Al usar .getUTCDay() en su lugar, obtiene el día de la semana para la zona horaria UTC.
Punto interesante hecho por @RayHatfield
console.log("UTC-time:", new Date("2022-01-29").getUTCHours()) // 0 console.log("UTC-time:", new Date("2022-01-29Z00:00:00").getUTCHours()) // 0 ("Z" is for "ZULU" -> UTC) console.log("UTC-time:", new Date("2022-01-29T00:00:00Z").getUTCHours()) // 0 (ISO 8601 date string -> UTC) console.log("UTC-time:", new Date("2022-01-29T00:00:00").getUTCHours()) // UTC time (h) for your local midnightConsulte https://en.m.wikipedia.org/wiki/ISO_8601 para obtener detalles sobre las cadenas de fecha.
Si desea obtener el nombre del día de la semana de cualquier fecha en cualquier zona horaria, puede usar toLocaleString con las opciones adecuadas.
Debido a que el analizador integrado analiza '2022-01-29' como UTC, la zona horaria debe establecerse en UTC. Si se requiere el nombre del día para alguna otra zona horaria, simplemente inserte la ubicación del representante de la IANA correspondiente.
// Saturday console.log(new Date('2022-01-29').toLocaleString('en',{ weekday: 'long', timeZone: 'UTC' }));De esa manera, no está tratando de ajustar manualmente la fecha.
El método getTimezoneOffset en el OP también funciona, incluso cuando el desplazamiento ha cambiado, como por ejemplo para el horario de verano o los cambios históricos, pero puede ser un poco más simple:
let d = new Date('2022-01-29'); d.setMinutes(d.getMinutes() - d.getTimezoneOffset()); console.log(d.getDay()); // 6 console.log(d.toLocaleString('en',{weekday:'long'})); // Saturdaylet weekday = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][new Date().getDay()]