Estoy tratando de usar UTC siempre que sea posible. Ahora encontré el siguiente comportamiento extraño y realmente no entiendo qué está pasando. Sería genial, si alguien pudiera dar un consejo.
Nota: Escribo mi código en Google Apps Script Editor.
Uso el siguiente código para crear una fecha y obtener el resultado en mi zona horaria local:
var testDate = Date.UTC(2022,0,1,0,0,0,0); Logger.log(Utilities.formatDate(new Date(testDate), 'Europe/Berlin', 'dd.MM.yyyy hh:mm')); El resultado es 01.01.2022 01:00 , como se esperaba, porque 'Europa/Berlín' está 1 hora detrás de UTC. Entonces, si quisiera que la salida fuera 01.01.2022 00:00 , intentaría lo siguiente:
var testDate = Date.UTC(2021,11,31,23,0,0,0); Logger.log(Utilities.formatDate(new Date(testDate), 'Europe/Berlin', 'dd.MM.yyyy hh:mm')); Pero el resultado que obtengo es: 01.01.2022 12:00 ¿Alguien puede indicarme por qué mi expectativa es incorrecta?
(Espero que mi inglés esté bien).
No creo que podamos responder directamente a la pregunta, porque parece que el problema es que Utilities.formatDate usa 12:00 para la medianoche (que es una de las dos formas válidas de escribir medianoche en muchos sistemas, especialmente cuando se usa un 12- reloj de horas, aunque normalmente lo sigue con algo que indica que son las 12:00 a. m., no las 12:00 p. m.). Por ejemplo, aquí hay un ejemplo de otro formateador que hace eso porque le digo explícitamente que use el tiempo de 12 horas:
const testDate = Date.UTC(2022,0,1,0,0,0,0); const dateTimeFormat = new Intl.DateTimeFormat("en", { hour12: true, timeZone: "UTC", timeStyle: "short", }).format; console.log(dateTimeFormat(testDate)); Por lo tanto, tendría que mirar Utilities.formatDate para ver si tiene una opción para el horario de 24 horas o al menos usar 00:00 para la medianoche, como lo hacen otros formateadores.
Pero más fundamentalmente, si está tratando de formatear en UTC, no jugaría juegos de compensación para hacerlo, sobre todo porque Berlín no siempre tiene una diferencia de una hora con respecto a UTC, a veces tiene una diferencia de dos horas (horario de verano). ¹ En su lugar, tendría un formateador que usa los accesores UTC en Date ( getUTCHours , getUTCMonth , etc.) para construir la cadena en lugar de usar la versión de hora local. O alguna biblioteca, o algo que use Intl.DateTimeFormat . Por ejemplo:
const testDate = Date.UTC(2022,0,1,0,0,0,0); const dateTimeFormat = new Intl.DateTimeFormat("de", { timeZone: "UTC", dateStyle: "medium", timeStyle: "short", }).format; // Outputs "01.01.2022, 00:00", which is close to but // not quite the same as your desired format console.log(dateTimeFormat(testDate)); // Outputs your desired format, but may not be flexible across locales const dateFormat = new Intl.DateTimeFormat("de", { timeZone: "UTC", dateStyle: "medium", }).format; const timeFormat = new Intl.DateTimeFormat("de", { timeZone: "UTC", timeStyle: "short", }).format; console.log(`${dateFormat(testDate)} ${timeFormat(testDate)}`);¹ Recuerda que el UTC no cambia, no tiene horario de verano.