一种方法是解析new Date().toLocaleString()
。
但是这在chrome / webkit中不起作用,因为它返回的字符串不依赖于用户的语言环境(参见http://code.google.com/p/chromium/issues/detail?id=3607的错误报告)
我强调我正在寻找一种只有客户端的解决方案,而且这种解决方案适用于铬。
答案 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/和日期。倾向于做我需要的一切!因此,您可以将其与自定义原型函数一起使用,这样就可以满足您的需求!