我如何知道我的用户是否来自欧盟国家?

How do I know whether my user is from EU countries?

由于欧盟针对广告发布商制定了特殊法律。我想为我的用户显示 cookie 同意书。但是我在互联网上找不到任何好的框架来确定用户是否来自欧盟国家。

有什么办法可以实现吗?

希望得到一些详细的答案。

谢谢

如果我正确理解你的问题,你可以通过确定用户的本地时区轻松地做到这一点。有几种方法可以做到这一点。

Moment.js

Moment Timezone 具有猜测用户时区的功能。如果您使用的是最新版本,它是非常准确的。

示例:

<div id="guess"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data-2012-2022.min.js"></script>
<script>
  document.getElementById('guess').innerText = moment.tz.guess();
</script>

Moment.js 使用 Intl API,这是 built-in JavaScript 国际化 API。它也有自己的数据库,它检查 Intl API 的结果以提供更准确的信息。它还要求您包含 Moment.js 才能工作。

Jstz 套餐

Jstz 是一个用于检测时区的简单轻量级包。它还利用了 Intl API,因此您可以对其结果充满信心。要使用该包,可以按如下方式抓取CDN:

<div id="guess"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>
<script>
  document.getElementById('guess').innerText = jstz.determine().name();
</script>

国际API本身:
可以直接使用Intl API

The Intl object is the namespace for the ECMAScript Internationalization API, which provides language sensitive string comparison, number formatting, and date and time formatting. The Intl object provides access to several constructors as well as functionality common to the internationalization constructors and other language sensitive functions.

用法示例:

<div id="guess"></div>
<script>
  document.getElementById('guess').innerText = Intl.DateTimeFormat().resolvedOptions().timeZone;
</script>

您可以从这些用于检测时区的库中注意到,它们不需要您端进行任何网络调用。这意味着如果您打算只选择用户时区,则可能不需要进行 IP 查找。

然后您可以将时区与特定的欧盟时区相匹配,并确定您的用户是否来自欧盟内部。

如果您想 actual/accurate 精确定位用户,则必须使用 GeoLocation。这是一个简单的脚本:https://raw.githubusercontent.com/AdeyinkaAdegbenro/Detect_Location/master/detect_location.js.

您可能想查看的其他 API(任何适合您的内容):

除了已接受的答案外,我还竭尽全力确定哪些时区受 GDPR 法律的约束。我用的是dayjs包(和momentjs基本一样)

consentRequired() {
dayjs.extend(timezone);
const tz = dayjs.tz.guess();
switch (tz) {
  case 'Europe/Vienna':
    return true;
  case 'Europe/Brussels':
    return true;
  case 'Europe/Sofia':
    return true;
  case 'Europe/Zagreb':
    return true;
  case 'Asia/Famagusta':
    return true;
  case 'Asia/Nicosia':
    return true;
  case 'Europe/Prague':
    return true;
  case 'Europe/Copenhagen':
    return true;
  case 'Europe/Tallinn':
    return true;
  case 'Europe/Helsinki':
    return true;
  case 'Europe/Paris':
    return true;
  case 'Europe/Berlin':
    return true;
  case 'Europe/Busingen':
    return true;
  case 'Europe/Athens':
    return true;
  case 'Europe/Budapest':
    return true;
  case 'Europe/Dublin':
    return true;
  case 'Europe/Rome':
    return true;
  case 'Europe/Riga':
    return true;
  case 'Europe/Vilnius':
    return true;
  case 'Europe/Luxembourg':
    return true;
  case 'Europe/Malta':
    return true;
  case 'Europe/Amsterdam':
    return true;
  case 'Europe/Warsaw':
    return true;
  case 'Atlantic/Azores':
    return true;
  case 'Atlantic/Madeira':
    return true;
  case 'Europe/Lisbon':
    return true;
  case 'Europe/Bucharest':
    return true;
  case 'Europe/Bratislava':
    return true;
  case 'Europe/Ljubljana':
    return true;
  case 'Africa/Ceuta':
    return true;
  case 'Atlantic/Canary':
    return true;
  case 'Europe/Madrid':
    return true;
  case 'Europe/Stockholm':
    return true;
  default:
    return false;
}

}