如何在不显示秒数的情况下使用 .toLocaleTimeString()?

Posted

技术标签:

【中文标题】如何在不显示秒数的情况下使用 .toLocaleTimeString()?【英文标题】:How do I use .toLocaleTimeString() without displaying seconds? 【发布时间】:2013-07-28 15:09:41 【问题描述】:

我目前正在尝试显示用户的时间而不显示秒数。有没有办法使用 javascript 的 .toLocaleTimeString() 来做到这一点?

做这样的事情:

var date = new Date();
var string = date.toLocaleTimeString();

将显示每个单位的用户时间,例如当前显示为下午 3:39:15。我是否能够显示相同的字符串,而无需秒? (例如下午 3:39)

【问题讨论】:

【参考方案1】:

Date.prototype.toLocaleString 返回的值取决于实现,所以你得到你得到的。您可以尝试解析字符串以删除秒数,但在不同的浏览器中可能会有所不同,因此您需要为使用的每个浏览器留出余地。

使用 Date 方法创建自己的明确格式并不困难。例如:

function formatTimeHHMMA(d) 
  function z(n)return (n<10?'0':'')+n
  var h = d.getHours();
  return (h%12 || 12) + ':' + z(d.getMinutes()) + ' ' + (h<12? 'AM' :'PM');

【讨论】:

不要解析从 toLocaleTimeString 返回的字符串。我已经好几年了,没有任何问题。但是今天我发现它不起作用。原来有一些特殊的 unicode 字符(例如 0x200E,一个从左到右的标记)不能被 Date.parse 处理。从来没有看到过。所以我将停止使用所有的语言环境函数,而只是构建我自己的时间格式化字符串。这将使我免于像这样的邪恶惊喜。 @GabeHalsmer——我不建议也从来没有建议允许 Date.parse 解析字符串(例如最后一段 here)。但这在这里无关紧要,根本没有提及,如果您认为是这样,您就误解了答案(例如“可以尝试解析...”)。 不错的链接。所以总而言之,人们必须要么制作自己的解析,要么制作自己的 ToString 方法,因为从根本上说 Date.prototype.toLocalString 和 Date.parse 是不兼容的。制作 ToString 对我来说似乎是最简单的事情。但是你已经实现了你自己的解析。因此,两者都适用于人们。我想让每个人都知道的重要一点是 Date.parse 不适用于 toLocaleString。我花了几个小时来追查这种不兼容,因为它是多么微妙。从左到右的标记在 Visual Studio 的调试器中是不可见的。 酷,又一次完全被误导的否决票。难怪人们不想把自己的名字告诉他们。 对于将日期存储和传输为其他格式,toISOString 和 getTime 可能为重新解析提供了最安全的日期格式。我不知道过去十年中有任何 JS 实现不处理从 getTime 返回的 UTC 毫秒版本,并且 ISO 值也在规范中作为 loooonnng 时间的可解析日期格式。但永远不要从 UI 元素中读取日期。那应该来自您的应用程序层。并且始终在 Safari 中进行测试。他们一直是关于日期对象的 IE6 级混蛋。【参考方案2】:

您始终可以根据您可以设置的page 设置选项,以摆脱秒数,类似这样

var dateWithouthSecond = new Date();
dateWithouthSecond.toLocaleTimeString([], hour: '2-digit', minute:'2-digit');

受 Firefox、Chrome、IE9+ 和 Opera 支持。在您的网络浏览器控制台上试一试。

【讨论】:

谢谢,我一直在寻找这个答案。 仅供参考 hour: "2-digit" 在 Chrome 42 和 FF 37 中都不适用于我 --- d = new Date(1429524912495).toLocaleTimeString('en-US', hour: '2-digit', minute: '2-digit', hour12: true) 在两者中都返回 "6:15 AM" 使用[] 省略特定的语言环境。这样你就可以留在用户区域:toLocaleTimeString([], hour: '2-digit', minute: '2-digit' 适用于 chrome 51:new Date().toLocaleTimeString([], hour: '2-digit', minute:'2-digit', hour12: false); "17:08" 这里是允许选项的文档(它基于一个单独的构造函数,但选项是一对一映射的):developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…【参考方案3】:

这是一个可以做到这一点的函数,用 cmets 解释:

  function displayNiceTime(date)
    // getHours returns the hours in local time zone from 0 to 23
    var hours = date.getHours()
    // getMinutes returns the minutes in local time zone from 0 to 59
    var minutes =  date.getMinutes()
    var meridiem = " AM"

    // convert to 12-hour time format
    if (hours > 12) 
      hours = hours - 12
      meridiem = ' PM'
    
    else if (hours === 0)
      hours = 12
    

    // minutes should always be two digits long
    if (minutes < 10) 
      minutes = "0" + minutes.toString()
    
    return hours + ':' + minutes + meridiem
  

正如其他人所指出的,由于 toLocaleTimeString() 可以在不同的浏览器中以不同的方式实现,因此这种方式可以提供更好的控制。

要了解有关 Javascript Date 对象的更多信息,这是一个很好的资源:@​​987654321@

【讨论】:

【参考方案4】:

我也一直在寻找解决这个问题的方法,这是我最终想出的:

function getTimeStr() 
    var dt = new Date();
    var d = dt.toLocaleDateString();
    var t = dt.toLocaleTimeString();
    t = t.replace(/\u200E/g, '');
    t = t.replace(/^([^\d]*\d1,2:\d1,2):\d1,2([^\d]*)$/, '$1$2');
    var result = d + ' ' + t;
    return result;

你可以在这里试试:http://jsfiddle.net/B5Zrx/

\u200E 是我在某些 IE 版本上看到的一些格式字符(它是从左到右的 unicode 标记)。

我假设如果格式化的时间包含类似“XX:XX:XX”的时间,那么它必须是带秒的时间,我删除了最后一部分,如果我没有找到这个模式,什么都不会改变。相当安全,但在一些奇怪的情况下可能会留下几秒钟。

我只是希望没有语言环境会改变格式化时间部分的顺序(例如,使其成为 ss:mm:hh)。这个从左到右的标记让我有点紧张,这就是为什么我不删除从右到左的标记 (\u202E) - 在这种情况下我宁愿找不到匹配项并留下在这种情况下,时间格式化为秒。

【讨论】:

+1 你是唯一一个回答正确的人。谢谢老哥 这对toLocaleTimeString() 返回的内容做出了很多假设,这可能不适用于所有语言环境。【参考方案5】:

我认为最初的问题可以很容易地用迄今为止被忽略的东西来回答:简单的字符串拆分。返回的时间是一个文本字符串,只需将其拆分为“:”分隔符并按照您想要的方式重新组合字符串。没有插件,没有复杂的脚本。来吧:

var myVar=setInterval(function()myTimer(),1000);

function myTimer() 
    var d = new Date();
    currentNow = d.toLocaleTimeString();
    nowArray = currentNow.split(':');
    filteredNow = nowArray[0]+':'+nowArray[1];
    document.getElementById("demo").innerhtml = filteredNow;

【讨论】:

【参考方案6】:

尽管这是一个较老的问题,但我自己最近也有同样的问题,并提出了一个更简单的解决方案,使用正则表达式和字符串替换函数作为另一种选择(不需要外部 js 库或依赖 ECMAScript内部化 API):

var d = new Date();
var localeTime = d.toLocaleTimeString();
var localeTimeSansSeconds = localeTime.replace(/:(\d2) (?=[AP]M)/, " ");

此方法使用正则表达式前瞻来获取字符串的 :ss AM/PM 结尾,并将 :ss 部分替换为空格,返回字符串的其余部分未触及。 (字面意思是“找到一个带有两位数字和一个空格的冒号,后面跟 AM 或 PM,然后用空格替换冒号、两位数字和空格部分)。

此表达式/方法仅适用于 en-US 和 en-US-like Locales。如果您还希望使用不使用 AM/PM 的英国英语 (en-GB) 获得类似的结果,则需要使用不同的正则表达式。

根据原始提问者的示例输出,我假设他们主要与美国观众和 en-US 时间模式打交道。

【讨论】:

【参考方案7】:

你可以试试这个,它可以满足我的需要。

var d = new Date();
d.toLocaleTimeString().replace(/:\d2\s/,' ');

d.toLocaleString().replace(/:\d2\s/,' ');

【讨论】:

这行不通,因为其他语言可能使用与: 完全不同的分隔符。【参考方案8】:

只需将日期转换为字符串,然后将您想要的子字符串连接起来。

let time = date.toLocaleTimeString();
console.log(time.substr(0, 4) + time.substr(7, 3))
//=> 5:45 PM

【讨论】:

请在您的帖子中添加一些解释。 toLocaleTimeString 根据区域设置在每个浏览器上返回不同的字符串。你不能依赖这些位置,你会在其他人的浏览器上得到不同的,可能是坏的结果。【参考方案9】:

使用语言环境:

var date = new Date();
date.toLocaleTimeString('fr-FR', hour: '2-digit', minute: '2-digit')

【讨论】:

【参考方案10】:

这对我有用:

var date = new Date();
var string = date.toLocaleTimeString([], timeStyle: 'short');

【讨论】:

值得注意的是,截至 2020 年 3 月,the timeStyle option is supported only in Chrome and Opera,而不是在 Firefox、Edge/IE 和 Safari 中。如果您想要广泛的覆盖范围,现在最好坚持使用小时和分钟选项。 对于 Safari / ios,这仅适用于您有 AM/PM 的美国。 en-US 将显示 3:16 PM,其他区域将显示 15:16:00。【参考方案11】:

我想要它有日期和时间,但没有秒,所以我用了这个:

var dateWithoutSecond = new Date();
dateWithoutSecond.toLocaleTimeString([], year: 'numeric', month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit');

它产生了以下输出:

2020 年 7 月 29 日下午 2:46

这正是我所需要的。曾在火狐工作过。

【讨论】:

以上是关于如何在不显示秒数的情况下使用 .toLocaleTimeString()?的主要内容,如果未能解决你的问题,请参考以下文章

vim - 如何在不计算行数的情况下删除一大块文本?

如何在不介入第三个变量的情况下实现两个数的交换

如何在不使用 transform.Rotate 的情况下在其本地或世界轴上旋转带有第二个四元数的四元数?

如何在不达到 Discord 的 1,000 个最大连接数的情况下运行从 API 更新的 Discord 机器人?

在不增加会话数的情况下跟踪 Android 中的后台事件的好方法是啥?

在不安装额外软件包的情况下获得以毫秒为单位的时间?