Me gustaría crear una función que convierta los nombres de los alias de la zona horaria en el nombre canónico de dicha zona horaria.
Estado de las zonas horarias de Wikipedia
Por ejemplo, si tuviera Africa/Accra , me gustaría poder buscar que Africa/Abidjan es el nombre canónico de la zona horaria.
function getCanonicalName(name) { // TODO } getCanonicalName('Africa/Accra'); // => 'Africa/Abidjan' Intenté usar moment-timezone y luxon para analizar el nombre de la zona, pero no parece haber una forma de aplicar ingeniería inversa a la zona horaria canónica como parte de estas bibliotecas.
De acuerdo con los documentos moment-timezone , puede obtener el nombre canónico de una zona horaria de la representación de datos "empaquetados", pero al observar la implementación del pack en su código fuente, parece que solo pasa el source.name .
luxon tiene un ayudante de normalizeZone , pero parece que solo devuelve una instancia de Zone de una amplia gama de tipos de entrada. Sin embargo, no normaliza el nombre de la zona. Hay un indicador isUniversal en luxon Zone s, pero este indicador parece estar relacionado con el horario de verano, no con el estado de la zona horaria.
Es posible que esto no reconozca esa zona específica como un alias desde que se actualizó en septiembre de 2021 :
Pero en general:
import moment from 'moment'; import momenttz from 'moment-timezone'; // From moment-timezone, but not exported function normalizeName (name) { return (name || '').toLowerCase().replace(/\//g, '_'); } function getCanonicalName(name) { const normalizedName = normalizeName(name); // A canonical zone might exist if (moment.tz._zones[normalizedName]) { return moment.tz._names[normalizedName]; } // If not, there'll be a link to a canonical name const canonicalZoneNormalized = moment.tz._links[normalizeName(name)]; // And return the friendly name return moment.tz._names[canonicalZoneNormalized]; } console.log(getCanonicalName('Pacific/Wallis')); // => Pacific/Tarawa console.log(getCanonicalName('Pacific/Tarawa')); // => Pacific/TarawaDado que la base de datos de zona horaria se actualiza solo una vez al año, creo que mi solución requiere poco mantenimiento. Estoy siguiendo un enfoque muy crudo aquí. En realidad, puede obtener la información que se muestra en la página de wikipedia en un JSON primero y luego obtener un mapa que contenga todas las zonas horarias y sus zonas horarias canónicas ejecutando esto en la consola del navegador:
const keys = []; const timezones = []; $("table:first thead tr th").each(function () { keys.push($(this).text().replace(/\n/g, '')); }); $("table:first tbody tr").each(function () { const obj = {}; let i = 0; $(this).children("td").each(function () { obj[keys[i]] = $(this).text().replace(/\n/g, ''); i++; }); timezones.push(obj); }); const canonicalTimezones = Object.assign({}, ...timezones.map(x => ({ [x['TZ database name']]: (x['Type'] === 'Canonical' ? x['TZ database name'] : x['Notes'].substring(8)) }))); JSON.stringify(canonicalTimezones);Puede guardar la salida en un archivo en algún lugar. Y luego solo necesita analizarlo en su código y obtener fácilmente la zona horaria canónica respectiva.
import canonicalTimezones from './canonicalTimezones.json'; function getCanonicalName(name) { return canonicalTimezones[name]; }