查看是否支持Intl.DateTimeFormat options.dateStyle?

Check if Intl.DateTimeFormat options.dateStyle is supported?

有什么方法可以检查 dateStyle 选项是否在 Intl.DateTimeFormat API 中受支持?

我刚刚意识到旧版本的 Safari 支持 Intl.DateTimeFormat 但不支持 options.dateStyle。我将不得不做一些其他事情来处理旧 Safari 上的日期格式,但我不想版本嗅探。

通常的字典陷阱应该可以(尽管我没有在旧版 Safari 中测试过,但我知道至少有一个 API他们得到 属性 即使他们不支持它,所以如果可以的话,在你身边测试它)。

“字典陷阱”是一个简单的 JS 对象,您可以在上面为 属性 添加一个 getter 以查看 API 是否支持它。如果调用了getter,我们可以假设属性是UA支持的。

请注意,虽然这不是免费的,但这将创建一个被测试接口的实际实例。为了避免这种情况,一般的技巧是使用具有高 alpha 值的 well-supported 属性,并放入 属性 的 getter。这样我们就避免了创建实例。这对所有属性都是不可能的,但是对于 dateStyle 我们很幸运,timeZone 紧随其后,它应该有很好的支持。

const supportDateStyle = (() => {
  let supported = false;
  try {
    new Intl.DateTimeFormat('en-US', {
      get dateStyle() { supported = true; },
      get timeZone() { throw ""; }
    });
  }
  catch(err) { }
  return supported;
})();

console.log({supportDateStyle});

现在,如果你害怕某些 UA 中的一些怪癖,也许更 bullet-proof 的解决方案是使用 resolvedOptions() 方法,并检查 dateStyle 属性 有没有。虽然这将创建格式化程序的实例。

const supportDateStyle = new Intl.DateTimeFormat("en-US", {dateStyle: "full"})
  .resolvedOptions().dateStyle === "full";

console.log({supportDateStyle});