JavaScript - 使用Intl获取当前区域设置以显示时间和日期

6

我希望我的网页可以显示用户所在地区的日期和时间。

现在大多数浏览器都支持 Intl(请参见Can I Use Intl),我可以通过使用 Intl.DateTimeFormat().resolvedOptions().timeZone 来获取浏览器时区。我希望能够使用当前语言环境发出日期时间,尝试了以下操作:

var date = new Date(2017, 11, 31, 23, 59, 59);
var format = new Intl.DateTimeFormat(
  undefined, // locale
  {
    year: "numeric",
    month: "numeric",
    day: "numeric",
    hour: "numeric",
    minute: "numeric",
  }
)

console.log(format.format(date))

我正在使用Windows上的Chrome浏览器。我的Windows操作系统区域设置为“捷克共和国”。我在Chrome中设置了首选网站语言为“捷克语”,但浏览器本身却设置为使用美式英语。
在这些设置下,输出的时间采用12小时制,就好像我的区域设置是“en-us”一样。只要我将Chrome浏览器切换为使用捷克语作为其显示语言,时间就会切换为24小时格式。
我认为我可能漏掉了一些显而易见的东西 - 网页真的无法使用用户正在使用的区域设置,还是这是Chrome Intl实现中的某个错误或不完整性?

在我看来,日期时间格式应该是硬编码的和/或反映文档的语言环境 document.documentElement.lang(如果设置了),而不是读者或导航器的语言环境。 - JukkaP
@JukkaP 所有表现良好的本地应用程序都尊重用户的语言环境设置(用户在系统中设置)。为什么在Web浏览器中显示的应用程序/网页应该是不同的呢? - Suma
如果您阅读的文档是使用'en-GB'语言环境编写的,您会期望文档的日期和时间格式遵循文档所在的语言环境,而不是芬兰语或捷克语。 - JukkaP
如果你看到这样的句子:“我在7月31日12:37写下了这条消息,今天是星期五”,你可能不会喜欢。 - JukkaP
1
桌面应用程序(如LibreCalc或Excel)似乎有所不同。即使我喜欢使用英语翻译,它们也允许我在自己的地区设置中处理数据。当谈及文档时,应用程序可能是芬兰语,但处理的文档可能是捷克语(即使“文档”仅包括日期和时间,比如电子表格)。 - Suma
显示剩余2条评论
1个回答

2

我发现在Chrome上,以下方法更加可靠:可以使用navigator.languages[0]获取用户首选用于内容的语言定义的区域设置。有关浏览器兼容性的讨论,请参见确定浏览器中用户区域设置的最佳方法

function getLocale() {
    return (navigator.languages && navigator.languages.length) ? navigator.languages[0] : navigator.language;
}


var locale = getLocale();
var date = new Date(2017, 11, 31, 23, 59, 59);
var format = new Intl.DateTimeFormat(
  locale,
  {
    year: "numeric",
    month: "numeric",
    day: "numeric",
    hour: "numeric",
    minute: "numeric",
  }
)

console.log(format.format(date))

尽管如此,似乎很遗憾用户所做的系统范围内的语言环境选择无法被访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接