Javascript - 检测用户的区域设置是否设置为使用12小时或24小时时间格式

时间:2011-05-30 04:19:44

标签: javascript google-chrome localization locale chromium

一种方法是解析new Date().toLocaleString()。 但是这在chrome / webkit中不起作用,因为它返回的字符串不依赖于用户的语言环境(参见http://code.google.com/p/chromium/issues/detail?id=3607的错误报告)

我强调我正在寻找一种只有客户端的解决方案,而且这种解决方案适用于铬。

5 个答案:

答案 0 :(得分:5)

只要Chromium没有修复toLocaleString(),铬就无法做到这一点。

对于Firefox和IE解析toLocaleString()将提供该信息。

修改
显然toLocalString()已在Chrome中修复。因此解析toLocaleString()是一种解决方案。

答案 1 :(得分:3)

你永远不应该这样搜索本地模式。 toLocaleString()显然是一个错误(源自Java),不应该使用。正如您所提到的,这种方法在各种浏览器中都不受支持(Chrome只是其中之一) 事实上,唯一能够正确(但不是100%正确)的网络浏览器(来自流行的浏览器)是IE浏览器。

要根据区域设置正确设置日期格式,请使用Globalize。它包含从.Net转出的本地化模式 您也可以使用Dojo,它也允许区别设置感知格式,但基于CLDR

编辑,存在新事实

JavaScript中的I18n有一个新标准 - ECMA-402。事实上,这个标准允许使用JS Date的对象。但是,应始终传递语言标记:

var date = new Date();
var formatted = date.toLocaleString('de-DE');

唯一的问题是,我唯一知道目前实施ECMA-402的网络浏览器是Google Chrome。

现在似乎仍然可以采用iLib的方式。

答案 2 :(得分:2)

为除Chrome以外的所有浏览器解析(new Date).toLocaleString(),并针对Chrome的区域设置及其时间格式检查navigator.language

答案 3 :(得分:2)

距离上次回答已经过去了几年,并且已经引入了一些技术来解决此问题。 Intl.DateTimeFormat是其中一种技术,它提供了有关各种语言环境的日期格式的大量信息。

console.log(new Intl.DateTimeFormat(undefined).resolvedOptions().hour12);

但是,大多数语言环境并未为hour12选项定义默认值。因此,如果返回undefined,我将查看formatToParts函数。

const hourParts = new Intl.DateTimeFormat(undefined, { hour: 'numeric' }).formatToParts(new Date(2020, 0, 1, 13));
console.log(hourParts);

该命令的输出应类似于(对于浏览器的当前语言环境;在我的情况下为“ en-US”):

[
  {
    "type": "hour",
    "value": "1"
  },
  {
    "type": "literal",
    "value": " "
  },
  {
    "type": "dayPeriod",
    "value": "PM"
  }
]

获取value等于type的部分"hour"的长度将告诉您是用十二小时还是二十四小时的时间格式化的。

例如,我碰巧知道在日本,他们用了24小时,所以我可以检查一下:

const hourParts = new Intl.DateTimeFormat('ja-JP', {
  hour: 'numeric'
}).formatToParts(new Date(2020, 0, 1, 13));
console.log(hourParts.find(part => part.type === 'hour').value.length);

我知道美国默认为十二小时制:

const hourParts = new Intl.DateTimeFormat('en-US', {
  hour: 'numeric'
}).formatToParts(new Date(2020, 0, 1, 13));
console.log(hourParts.find(part => part.type === 'hour').value.length);

将其包装在函数中很容易:

function localeUses24HourTime(locale) {
  return new Intl.DateTimeFormat(locale, {
    hour: 'numeric'
  }).formatToParts(new Date(2020, 0, 1, 13)).find(part => part.type === 'hour').value.length === 2;
}

console.log(localeUses24HourTime()); // undefined means current user's locale
console.log(localeUses24HourTime('en-US')); // a specific locale known to be false
console.log(localeUses24HourTime('ja-JP')); // a specific locale known to be true

与解析toLocaleString()的输出相比,您可能会发现它或多或少复杂。

答案 4 :(得分:1)

我知道这将是最不受欢迎的方式,但你能不能只检查时间吗?

如果时间在12之前,请将时间设置为下午1点,并测试输出是13还是1.

我知道这是一个想法的鞋拔,但如果置于一个不错的Date.prototype.is24hour(),则返回true;它可以很好地工作吗?

我使用http://www.datejs.com/和日期。倾向于做我需要的一切!因此,您可以将其与自定义原型函数一起使用,这样就可以满足您的需求!