Estoy usando el complemento de calendario https://fullcalendar.io/ en una aplicación. Proporciono al calendario datos con las fechas en formato iso8601, así, "2021-09-15T14:30:00+01:00" , y el calendario hace un buen trabajo al mostrar esas horas ajustadas para la zona horaria establecida en el navegador.
Por ejemplo, si el navegador está en una zona horaria "+01:00", esa hora se muestra como 14:30, pero si está en una zona horaria "+02:00", se muestra como 15:30, etc.
Mi problema es que me gustaría mostrar esos tiempos en otros contextos, fuera del calendario, y no quiero generar cosas diferentes desde el servidor; quiero que la conversión se realice en el navegador, usando javascript.
Se me ocurrió que podría hacer algo como esto: generar el tiempo en un lapso con la cadena iso861 en un atributo de datos, quizás también con una clase que actúe como disparador para algunos js generales en la página. Pero, ¿hay una manera simple en JS de convertir la cadena de tiempo iso8601 en una hora usando la configuración de zona horaria del navegador? Supongo que necesitaría tener otro atributo de datos que tenga información sobre cómo quiero que esté formateado, algo así como "%H:%M" en este caso (si quiero generar "14:30" o "15: 30").
Nota: usamos jquery y lo usaré en mi ejemplo JS a continuación.
Algo como esto:
<!-- in html - the span contains the default unconverted time --> <span class="convertable-time" data-iso8601="2021-09-15T14:30:00+01:00" data-datetime-format="%H:%M">14:30</span>y luego en el JS algo como esto (esto está usando jquery pero la solución no necesita)
$(".convertable-time").each(function(i,el){ el = $(el); el.html(convertIso8601StringToLocalTime(el.data("iso8601"), el.data("datetime-format")); }); function convertIso8601StringToLocalTime(string, format){ //eg string = "2021-09-15T14:30:00+01:00" //eg format = "%H:%M" // ?? } ¿Qué pondría en la función convertIso8601StringToLocalTime ? Nota: no estoy casado con la cadena de formato exacta de "% H:% M", si hay una forma más estándar de especificar un formato de fecha y hora en JS, entonces me complace usarlo. Gracias.
Esto es lo que terminé haciendo:
//expects timestring to be an iso8601 formatted datetime string eg "2021-09-15T14:30:00+01:00" //accepted strings for "format": copied from ruby's DateTime#strftime method // %M - minutes // %H - hours // %S - seconds // %d - day of the month // %Y - year four digits // %y - year two digits // %m - month (as a number) function convertIso8601StringToLocalTime(timestring, format){ //set default format if((typeof(format) == "undefined") || (format == "")){ format = "%H:%M"; } var date = new Date(timestring); var replacements = { "getMinutes": /\%M/g, "getHours": /\%H/g, "getDate": /\%d/g, "getFullYear": /\%Y/g, "getMonth": /\%m/g } for (const [function_name, regex] of Object.entries(replacements)) { if(format.match(regex)){ format = format.replace(regex, date[function_name]()); } } // year two digits doesn't have a method we can call on a Date as far as I can see // ('getYear()' returns '121' for me which is mysterious) // so we do it 'manually' here by modding the full year by 100 if(format.match(/\%y/g)){ format = format.replace(/\%y/g, (date.getFullYear() % 100)); } return format; }