es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Luxon: Obtén una matriz de desplazamientos y hasta (como podemos hacerlo en moment-timezone)

Con la biblioteca moment-timezone, actualmente solo obtengo la información sin procesar para una zona horaria específica y luego la utilizo directamente en mi código siguiente.

const zone = moment.tz.zone('Europe/London');

Esto es un objeto que contiene lo siguiente:

{
    "name":"Europe/London",
    "abbrs":["GMT","BST","GMT","BST", ...],
    "untils":[-1691964000000,-1680472800000,-1664143200000,-1650146400000, ...],
    "offsets":[0,-60,0,-60,0, ...],
    "population":10000000
}

Los arrays de offsets y untils son realmente todo lo que necesito de moment… el resto lo manejo “manualmente” en el código siguiente utilizando los arrays de offsets y untils (o en realidad solo un pequeño subconjunto de ellos)… sin tener que depender de moment como una dependencia.

¿Existe una forma equivalente de extraer los arrays de offsets y untils en la biblioteca luxon?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, con la biblioteca luxon, puedes utilizar la API Intl para obtener los arrays offsets y untils de una zona horaria específica. Aquí tienes un ejemplo:

    const tz = 'Europe/London';
    const dt = luxon.DateTime.local().setZone(tz); // crea un nuevo objeto DateTime para la zona horaria
    const timeZone = dt.zoneName; // obtén el nombre de la zona horaria
    const intlOpts = { timeZone, formatMatcher: 'best fit' };
    const formatter = new Intl.DateTimeFormat([], intlOpts); // crea un nuevo objeto formateador
    const { timeZoneName, timeZoneOffset } = formatter.formatToParts(dt)[0].value; // obtén las partes que contienen el nombre y el desplazamiento de la zona horaria
    const offsets = [0]; // inicializa el array `offsets` con cero como primer valor
    const untils = [dt.toMillis()]; // inicializa el array `untils` con el valor actual de DateTime en milisegundos
    for (let i = 0; i < 12; i++) { // recorre los próximos 12 meses
      const nextDt = dt.plus({ months: i + 1 }); // obtén el próximo objeto DateTime para la misma zona horaria
      const { timeZoneOffset: nextTimeZoneOffset } = formatter.formatToParts(nextDt)[0].value; // obtén el desplazamiento para el próximo mes
      if (timeZoneOffset !== nextTimeZoneOffset) { // si el desplazamiento cambia
        offsets.push(parseInt(nextTimeZoneOffset, 10)); // agrega el nuevo desplazamiento al array `offsets`
        untils.push(nextDt.toMillis()); // agrega el nuevo valor de DateTime en milisegundos al array `untils`
      }
    }
    

    Esto te dará los arrays offsets y untils para la zona horaria especificada, que luego puedes utilizar en tu código según sea necesario. Ten en cuenta que esto asume que solo necesitas calcular los desplazamientos y los valores de untils para los próximos 12 meses, pero puedes ajustar el bucle según tu caso de uso.

Comments are closed.