【问题标题】:JavaScript to determine if browser is displaying the time input using a 12-hour or 24-hour format用于确定浏览器是否使用 12 小时或 24 小时格式显示时间输入的 JavaScript
【发布时间】:2020-08-23 19:53:00
【问题描述】:

我想确定浏览器如何显示时间输入:

<input type="time">

显示为 24 小时制还是 12 小时制(添加了“AM/PM”选项)?

显示会影响设计,因为两个版本的宽度不同。我想保持多个输入的宽度尽可能紧凑。

我仔细看了其他文章,但是很多都比较老了,信息已经过时了,运行代码摘录时,结果并不一致。

此 JavaScript 仅采用语言环境(此处为:en_GB)并按如下方式应用它:

var hour_format = new Date().toLocaleTimeString();
console.log(hour_format); // Firefox: 18:12:34, Chrome: 6:12:34 PM, Edge: 18:12:34

附加说明:我在英国,我在 Windows 10 上使用 24 小时格式。浏览器反映了 24 小时系统偏好; JavaScript 时间字符串没有。当我更改为 12 小时格式(并重新启动)时,更改仅由 Chrome 应用。 JavaScript 示例中的值保持不变。我读过this article about GB locales,但它只是显示了不一致之处。

基本上,我只想知道浏览器显示的是哪一个。就是这样。

如果无法做到这一点,则强制输入以 24 小时格式显示是一种替代方法。

【问题讨论】:

  • 如果通过检查浏览器用于显示本地格式化时间的格式以可靠的方式无法做到这一点,是否可以查询实际输入字段的宽度?
  • 好的,这是使用宽度方法解决的一种。 Chrome 是一个棘手的浏览器,因此对时间输入元素的宽度进行检查会返回:24 小时格式为 65 像素,12 小时格式为 92 像素。这与字符串检查相结合应该足够准确。 “解决了”。

标签: javascript input time locale


【解决方案1】:

我终于明白你的实际问题了

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/time#Appearance

在 Chrome/Opera 中,时间控制很简单,可以根据操作系统区域设置以 12 或 24 小时格式输入小时和分钟,并使用向上和向下箭头来增加和减少当前选定的组件。在某些版本中,提供了一个“X”按钮来清除控件的值。


Firefox 的时间控制与 Chrome 的非常相似,只是它没有向上和向下箭头。它还根据系统区域设置使用 12 小时或 24 小时格式输入时间。提供了一个“X”按钮来清除控件的值。


[假设边缘在 Chromium 之前]

Edge 时间控制更加精细,通过滑动卷轴打开小时和分钟选择器。它与 Chrome 一样,根据系统区域设置使用 12 或 24 小时格式输入时间:

所以也许这会回答你的问题?

const t = document.createElement("input")
t.type = "time"
t.value = "15:00"
document.body.appendChild(t)
console.log(t.offsetWidth);

const width = getComputedStyle(t).getPropertyValue("width")
console.log(width)

/*
for (let i=0; i<style.length; i++) {        
    cssProperty = style[i];
    if (cssProperty.toUpperCase().indexOf("WIDTH") !=-1) {
      cssValue = style.(cssProperty);
      console.log(cssProperty,cssValue)
    }      
}*/

旧答案:

var hour_format = new Date().toLocaleTimeString();
console.log(hour_format.length); // Firefox: 18:12:34, Chrome: 6:12:34 PM, Edge: 18:12:34
if (hour_format.length > 8) hour_format = hour_format.split(" ")[0]; // drop the pm
console.log(hour_format)

// Force 24 hour:
console.log(new Date().toLocaleTimeString('en-GB')); // should be 24 hours, no PM

// Test 24 hours:
const test = new Date(2020,4,8,15,0,0,0).toLocaleTimeString();
if (parseInt(test) === 15) console.log("24 hour")

【讨论】:

  • 我已尝试为您找到以 px 为单位的宽度。这有帮助吗?
  • 感谢您的解决方案。我结合了您之前的部分答案和我自己对 Chrome 对这两种格式的不同宽度进行的测试。我无法在此处发布代码,但对于 Chrome,它使用输入宽度 - 低于 81 像素:24 小时及以上:12 小时。
  • 每个浏览器都以自己的方式处理时间输入的外观。 Edge 不是问题,因为下拉方法与页面中的输入是分开的。 Firefox 使用与区域设置文本匹配的显示。 Chrome 与显示器不匹配,所以我只是在这种情况下使用像素宽度作为后备。我认为这可以暂时解决问题。感谢您的帮助!
【解决方案2】:

这是我通过结合@mplungjan 的第一个解决方案和@CBroe 检查输入宽度的建议得出的解决方案:

var local_time_string = (/chrom(e|ium)/i.test(navigator.userAgent) && !/msie|edge/i.test(navigator.userAgent)) ? false : (new Date(2020, 4, 8, 18, 0, 0, 0).toLocaleTimeString()),
  hour_format = (typeof local_time_string == 'string') ? ((parseInt(local_time_string) == 18) ? 24 : 12) : null;

if (hour_format == null) {
  $('#parent-element').append('<input type="time" id="time-test" name="time-test" style="width: auto; position: absolute; opacity: 0; visibility: hidden;">');
  hour_format = ($('#time-test').width() < 81) ? 24 : 12;
  $('#time-test').remove();
}

console.log(hour_format);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="parent-element"></div>

【讨论】:

    【解决方案3】:

    可能对您的问题有用,我认为它可以回答相同的问题。

    如果您需要将时间格式中包含的 PM 字符串转换为 24 小时制,例如“06:45:05PM”,您可以使用此代码。

    function deletePMAMAndChangeTo24Hour(s){
    
    return s.substr(s.length -2) !== "PM" && s.slice(0,-2).split(':')[0]==12
        ?s.slice(0,-2).replace(s.slice(0,-2).split(':')[0],'00')
        :s.substr(s.length -2) !== "AM" && parseInt(s.slice(0,-2).split(':')[0])<12 
        ?s.slice(0,-2).replace(
            s.slice(0,-2).split(':')[0],
        parseInt(s.slice(0,-2).split(':')[0]) + 12
        )
        :s.slice(0,-2)
    }
    
    const changedTime = deletePMAMAndChangeTo24Hour('07:05:45PM')
    

    【讨论】:

    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
    • 感谢您的关注。
    • 对不起@hakkisabah,这不是这里提出的问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2011-11-18
    • 2020-06-29
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多