Javascript — Detect if user's locale are set to use 12-hour or 24-hour time format
一种方法是解析new Date().toLocaleString()。
但这在chrome / webkit中不起作用,因为它返回的字符串不依赖于用户的语言环境(请参阅http://code.google.com/p/chromium/issues/detail?id=3607上的错误报告)
我强调,我正在寻找一种只有客户端的解决方案,并且它在铬中起作用。
-
我想这可能会对你有所帮助[如何在显示时间 - 用户 - 语言环境格式和时间偏移] [1] [1]:stackoverflow.com/questions/85116/…
-
只做一个男人,并为每个人强制24小时!
-
@ brillout.com您接受的答案已过时。 请更新这个问题并检查EliGreys的答案(请注意,有人给了他100分以上!)
只要Chromium不能修复toLocaleString(),铬就无法做到这一点。
对于Firefox和IE解析,toLocaleString()将提供该信息。
编辑
显然toLocalString()已在Chrome中修复。因此解析toLocaleString()是一种解决方案。
-
这个答案已经过时了:它已在Chrome中修复(~v32)!
-
不幸的是,Chrome似乎并不尊重用户24小时的偏好 - 我并排使用Chrome和Safari,Safari正确反映了24小时,而Chrome正在使用12小时。
-
@agnoster你确定吗?我在OSX设置中设置我的时间显示以使用24小时时钟,然后在Safari中测试,然后我回到12小时。 Apple可能修复了这个错误,因为调用toLocaleString()要求将时间格式化为某个区域设置,并且在系统设置中遵守区域设置格式的覆盖将是不正确的。
-
@agnoster我不确定你是否知道,但遇到这个答案的人并不知道它已被修复,除非有人指出它,我已经完成了。当你搜索谷歌时,这只是谷歌的第三个结果,所以指出它是有点重要的。如果你对此很嗤之以鼻,那么就是出于正当的理由,而不是因为你的摇摇欲坠。此外,我刚刚在Chrome中尝试过,无法获得24小时格式。您确定Chrome的默认语言区域不是en-US吗?
你永远不应该这样搜索本地模式。 toLocaleString()显然是一个错误(源自Java),不应该使用。正如您所提到的,这种方法在各种浏览器中都不受支持(Chrome只是其中之一)。
事实上,唯一能够正确(但不是100%正确)的网络浏览器(来自流行的浏览器)是IE浏览器。
要根据区域设置正确格式化日期,请使用Globalize。它包含从.Net转储的本地化模式。
您也可以使用Dojo,它也允许区域设置感知格式,但基于CLDR。
编辑,存在新的事实
JavaScript中的I18n有一个新标准 - ECMA-402。实际上这个标准允许使用JS Date的对象。但是,应始终传递语言标记:
1 2
| var date = new Date();
var formatted = date.toLocaleString('de-DE'); |
唯一的问题是,我所知道的目前唯一实现ECMA-402的网络浏览器是Google Chrome。
现在似乎仍然可行的方法是使用iLib的内容。
-
感谢有关toLocaleString的信息。实际上我只想知道用户的语言环境是否设置为使用12小时或24小时格式。所以我猜toLocaleString可以为Firefox和IE做这个工作。对于Globalize和CLDR,它不起作用,因为12小时/ 24小时格式独立于用户语言环境的语言
-
@ cept0:显然,你必须是I18n的长期专家。我很抱歉,我保证不再在I18n上写任何东西。 BTW。在撰写本文时,ECMA-402尚未存在。
为除Chrome以外的所有浏览器解析(new Date).toLocaleString(),并针对Chrome的区域设置地图及其时间格式检查navigator.language。
-
这不起作用。正如我在Pawel的回答中评论的那样,12小时/ 24小时格式独立于用户语言环境的语言。例如。我曾经使用en-US但是24小时格式
-
对不起,但你是少数。仅仅因为某人可以改变默认值并不意味着大多数人都会这样做。 en-US和12小时格式之间存在足够高的相关性,您应该忽略极少数边缘情况。它要么是,要么根本没有解决方案,因为JavaScript无法访问操作系统级别的设置。
-
你说"足够高的相关性"。你有任何统计/来源支持你的说法吗?谢谢
-
对不起,没有经验统计,只有我的轶事证据。认为具有en-US语言环境的人更可能使用12小时格式似乎很明显。
-
嗯。最后我检查了"更有可能"和"少数边缘案例"在不同的领域;如果你说"忽略任何使用24小时和英语(美国)的人",你就会忽略因商业原因和24小时使用美国英语的大批国际用户。更不用说你无视军队;-)如果你基本上愿意说"只有生活在美国的平民更喜欢上午/下午的事情",你真的不应该参与本地化/国际化的努力; - )
-
@agnoster你怎么建议这样做呢?您只能在浏览器中获取区域设置,并且区域设置确定时间格式。
-
@DanielT。我建议如果用户指定他们想要24小时,他们应该得到24小时。也许我们需要一个名为.toUserPreferredTimeFormatString()的新方法来安抚那些不想玷污toLocaleString()的抽象纯度的学生,如果它不符合标准化的语言环境,则根据用户想要的格式进行格式化。 : - /
-
@agnoster然后由浏览器供应商实现一些能告诉我们用户自定义时间设置的内容。另外,"根据用户想要的格式化,如果它不符合标准化的语言环境"这是toLocaleString()的重点,不是吗?要使用给定语言环境的标准格式来格式化时间?
我知道这将是最不受欢迎的方式,但你能不能只检查时间?
如果时间在12之前,则将时间设置为1pm并测试输出是13还是1。
我知道它是一个想法的鞋拔,但如果放入一个漂亮的Date.prototype.is24hour(),则返回true;它可以很好地工作?
我使用http://www.datejs.com/和日期。倾向于做我需要的一切!因此,您可以将其与自定义原型功能一起使用,这将为您提供所需的功能!
-
这在chrome中不起作用,因为chrome将始终返回13
-
那么也许,铬用户只需坚持24小时?该实现仍然可以用于其他所有浏览器,但只需在chrome上显示13!