Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果用户';s机器使用12小时制(上午/下午)或24小时制(军事时间)_Javascript_Date_Time_Webkit_Clock - Fatal编程技术网

Javascript 如果用户';s机器使用12小时制(上午/下午)或24小时制(军事时间)

Javascript 如果用户';s机器使用12小时制(上午/下午)或24小时制(军事时间),javascript,date,time,webkit,clock,Javascript,Date,Time,Webkit,Clock,是否可以检测用户的机器使用的是12小时制(am/pm)还是24小时制(军用时间) 一种方法是检查用户的区域设置,但这只是一个巨大的区域设置比较列表,来自美国的人谁想要12小时的时钟可以发送给我只是在区域设置,而不是我们,我没有办法知道她的喜好。同时,来自美国的人可能会将她的机器设置为使用12小时的时间格式,而不需要12小时的时钟 编辑: 正如用户Mouser在下面建议的那样,它在理论上是可行的,但不幸的是,它在WebKit浏览器上(在Chrome和Windows上的new Opera上进行了测试

是否可以检测用户的机器使用的是12小时制(am/pm)还是24小时制(军用时间)

一种方法是检查用户的区域设置,但这只是一个巨大的区域设置比较列表,来自美国的人谁想要12小时的时钟可以发送给我只是在区域设置,而不是我们,我没有办法知道她的喜好。同时,来自美国的人可能会将她的机器设置为使用12小时的时间格式,而不需要12小时的时钟

编辑:

正如用户Mouser在下面建议的那样,它在理论上是可行的,但不幸的是,它在WebKit浏览器上(在Chrome和Windows上的new Opera上进行了测试),并且由于某些原因总是返回am/pm时间

例如:


因此,如果有人知道如何在webkit浏览器上实现这一点,我想我必须重新表述我的问题。

这个解决方案在大多数浏览器中都有效,但在Chrome中却存在bug

    let result = false;
    const date = new Date();
    const dateString = date.toLocaleTimeString(language, {
        timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
        timeStyle: 'short'
    });
    
    if (dateString.match(/am|pm/i) || date.toString().match(/am|pm/i)) {
        result = true;
    }
    else {
        result = false;
    }
var date=新日期(date.UTC(2012,11,12,3,0,0));
var dateString=date.toLocaleTimeString();
//显然toLocaleTimeString()在Chrome中有一个bug。但是,toString()返回12/24小时格式。如果其中一个包含AM/PM,则执行12小时编码。
if(dateString.match(/am | pm/i)| date.toString().match(/am | pm/i))
{
//12小时钟
控制台日志(“12小时”);
}
其他的
{
//24小时制
控制台日志(“24小时”);

}
此解决方案适用于大多数浏览器,但在Chrome中存在缺陷

    let result = false;
    const date = new Date();
    const dateString = date.toLocaleTimeString(language, {
        timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
        timeStyle: 'short'
    });
    
    if (dateString.match(/am|pm/i) || date.toString().match(/am|pm/i)) {
        result = true;
    }
    else {
        result = false;
    }
var date=新日期(date.UTC(2012,11,12,3,0,0));
var dateString=date.toLocaleTimeString();
//显然toLocaleTimeString()在Chrome中有一个bug。但是,toString()返回12/24小时格式。如果其中一个包含AM/PM,则执行12小时编码。
if(dateString.match(/am | pm/i)| date.toString().match(/am | pm/i))
{
//12小时钟
控制台日志(“12小时”);
}
其他的
{
//24小时制
控制台日志(“24小时”);

}
toLocaleTimeString
应该以反映用户偏好的格式提供时间,但它不可靠

我使用的是Debian系统。
locale
的输出为:

LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=
以下是一些关于日期的实验:

$ date +%X
05:23:32 PM
$ LANG=en_GB date +%X
17:24:06
$ LC_TIME=en_GB date +%X
17:24:22
%X
格式告诉
date
根据区域设置输出时间。上述结果与预期完全一致。设置
LC\u TIME
是一种仅更改时间格式,但保持区域设置中其他所有内容不变的方法。因此,即使
en_US
的默认值为12,美国人也可以使用24小时时间格式

我已经在我的系统上试用过:

$ firefox --no-remote
[Shows a time in the 12 hour format, as expected.]
$ LANG=en_GB firefox --no-remote
[Shows a time in the 24 hour format, as expected.]
到目前为止还不错。但是,

$ LC_TIME=en_GB firefox --no-remote
[Shows a time in the 12 hour format, this is wrong!]

我用Chrome也能得到同样的结果。似乎Firefox和Chrome都忽略了
LC_TIME

toLocaleTimeString
应该以反映用户偏好的格式给出时间,但这是不可靠的

我使用的是Debian系统。
locale
的输出为:

LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=
以下是一些关于日期的实验:

$ date +%X
05:23:32 PM
$ LANG=en_GB date +%X
17:24:06
$ LC_TIME=en_GB date +%X
17:24:22
%X
格式告诉
date
根据区域设置输出时间。上述结果与预期完全一致。设置
LC\u TIME
是一种仅更改时间格式,但保持区域设置中其他所有内容不变的方法。因此,即使
en_US
的默认值为12,美国人也可以使用24小时时间格式

我已经在我的系统上试用过:

$ firefox --no-remote
[Shows a time in the 12 hour format, as expected.]
$ LANG=en_GB firefox --no-remote
[Shows a time in the 24 hour format, as expected.]
到目前为止还不错。但是,

$ LC_TIME=en_GB firefox --no-remote
[Shows a time in the 12 hour format, this is wrong!]

我用Chrome也能得到同样的结果。Firefox和Chrome似乎都忽略了
LC\u TIME

除了不应该这样做之外,
.toLocaleTimeString()
即使可以跨浏览器工作,也不是一个好的解决方案。它按照用户计算机设置的格式返回一个时间字符串,但也可能有一个24小时的时钟仍然显示AM/PM,也可能有一个12小时的时钟不显示AM/PM。准确或可靠地检测到这一点是不可行的。

除了永远不应该这样做之外,
。toLocaleTimeString()
即使可以跨浏览器工作,也不是一个好的解决方案。它按照用户计算机设置的格式返回一个时间字符串,但也可能有一个24小时的时钟仍然显示AM/PM,也可能有一个12小时的时钟不显示AM/PM。要准确或可靠地检测到这一点是不可行的。

这条简单的线路似乎适合我

var is24 = ((new Date(2014, 01, 01, 15, 0, 0, 0)).toLocaleTimeString().indexOf("15") > -1);

虽然它在Chrome(IE和Firefox)中仍然不起作用

但这句简单的话似乎对我很有用

var is24 = ((new Date(2014, 01, 01, 15, 0, 0, 0)).toLocaleTimeString().indexOf("15") > -1);

尽管它在Chrome(IE和Firefox)中仍然不起作用,但它适用于所有地区,包括非拉丁数字系统的地区。因为它非常灵活,所以您需要知道是否以及如何处理这种类型的场景

这不支持IE 10或更早版本

函数为12小时(语言环境){
return!!新建Intl.DateTimeFormat(区域设置,{hour:'numeric'})。格式(0)。匹配(/\s/);
}
log(is12Hour());
console.log(is12Hour('en-GB'));

console.log(is12Hour('ar-SA'))这适用于所有地区,包括非拉丁数字系统的地区。因为它非常灵活,所以您需要知道是否以及如何处理这种类型的场景

这不支持IE 10或更早版本

函数为12小时(语言环境){
return!!新建Intl.DateTimeFormat(区域设置,{hour:'numeric'})。格式(0)。匹配(/\s/);
}
log(is12Hour());
console.log(is12Hour('en-GB'));

console.log(is12Hour('ar-SA'))
您可以使用国际化API和
解析选项来确定
小时周期

const locale = navigator.language
Intl.DateTimeFormat(locale,  { hour: 'numeric' }).resolvedOptions().hourCycle // ?
Intl.DateTimeFormat('en-US', { hour: 'numeric' }).resolvedOptions().hourCycle // h12
Intl.DateTimeFormat('en-GB', { hour: 'numeric' }).resolvedOptions().hourCycle // h23

您可以使用带有
解析选项的国际化API来确定
小时周期

const locale = navigator.language
Intl.DateTimeFormat(locale,  { hour: 'numeric' }).resolvedOptions().hourCycle // ?
Intl.DateTimeFormat('en-US', { hour: 'numeric' }).resolvedOptions().hourCycle // h12
Intl.DateTimeFormat('en-GB', { hour: 'numeric' }).resolvedOptions().hourCycle // h23

这在Chrome中适用于我。我使用了@Mouser中选择的答案,该答案在Chrome中不起作用

    let result = false;
    const date = new Date();
    const dateString = date.toLocaleTimeString(language, {
        timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,
        timeStyle: 'short'
    });
    
    if (dateString.match(/am|pm/i) || date.toString().match(/am|pm/i)) {
        result = true;
    }
    else {
        result = false;
    }

这在Chrome中适用于我。我使用了@Mouser中选择的答案,该答案不起作用