我正在寻找一种解决方案,根据 JavaScript 中的时区确定用户所在的国家/地区,而不依赖于 IP 到位置服务,例如 maxmind、ipregistry 或 ip2location。目标是利用
moment-timezone
库将时区映射到国家/地区,并在未找到匹配的情况下返回匹配的国家/地区或原始时区。
为了在不诉诸 IP 到位置服务的情况下实现此目的,以下代码利用
moment-timezone
库将时区映射到国家/地区。函数 getCountryByTimeZone
迭代国家列表并检查提供的时区是否与任何国家/地区关联。如果找到匹配项,它将使用 Intl.DisplayNames
检索完整的国家/地区名称;否则,它返回原始时区。
// Import the moment-timezone library
const moment = require('moment-timezone');
/**
* Get the user's country based on their time zone.
* @param {string} userTimeZone - The user's time zone.
* @returns {string} The user's country or the original time zone if not found.
*/
function getCountryByTimeZone(userTimeZone) {
// Get a list of countries from moment-timezone
const countries = moment.tz.countries();
// Iterate through the countries and check if the time zone is associated with any country
for (const country of countries) {
const timeZones = moment.tz.zonesForCountry(country);
if (timeZones.includes(userTimeZone)) {
// Use Intl.DisplayNames to get the full country name
const countryName = new Intl.DisplayNames(['en'], { type: 'region' }).of(country);
return countryName;
}
}
// Return the original time zone if no matching country is found
return userTimeZone;
}
// Example usage
const userTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
const userCountry = getCountryByTimeZone(userTimeZone);
console.log('User country based on time zone:', userCountry);