Javascript 如何使用.toLocaleTimeString()而不显示秒数?

Javascript 如何使用.toLocaleTimeString()而不显示秒数?,javascript,time,Javascript,Time,我目前正在尝试显示用户的时间,但不显示秒数。有没有一种方法可以使用Javascript的.toLocaleTimeString()实现这一点 这样做: var date = new Date(); var string = date.toLocaleTimeString(); 将显示每个单位的用户时间,例如,当前显示下午3:39:15。我是否能够显示相同的字符串,只是没有秒数?(例如,下午3:39)返回的值取决于实现,因此您可以得到所得到的。您可以尝试解析字符串以删除秒数,但在不同的浏览器中可

我目前正在尝试显示用户的时间,但不显示秒数。有没有一种方法可以使用Javascript的.toLocaleTimeString()实现这一点

这样做:

var date = new Date();
var string = date.toLocaleTimeString();
将显示每个单位的用户时间,例如,当前显示下午3:39:15。我是否能够显示相同的字符串,只是没有秒数?(例如,下午3:39)

返回的值取决于实现,因此您可以得到所得到的。您可以尝试解析字符串以删除秒数,但在不同的浏览器中可能会有所不同,因此您需要考虑使用的每个浏览器

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

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');
}
函数格式timehhmma(d){

函数z(n){return(n您总是可以设置选项,基于此您可以设置,以消除秒数,类似这样

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

受Firefox、Chrome、IE9+和Opera支持。请在您的web浏览器控制台上试用。

这里有一个函数可以实现此功能,并附有注释说明:

  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
  }
函数显示时间(日期){
//getHours返回本地时区从0到23的小时数
var hours=date.getHours()
//getMinutes返回本地时区从0到59的分钟数
var minutes=date.getMinutes()
var meridiem=“AM”
//转换为12小时时间格式
如果(小时数>12){
小时=小时-12
梅里迪姆=‘下午’
}
否则如果(小时===0){
小时=12
}
//分钟应始终为两位数
如果(分钟<10){
分钟数=“0”+分钟数.toString()
}
返回时数+':'+分钟数+meridiem
}
正如其他人所指出的,toLocaleTimeString()可以在不同的浏览器中以不同的方式实现,因此这种方式提供了更好的控制


要了解有关Javascript日期对象的更多信息,这是一个很好的资源:

我也一直在寻找这个问题的解决方案,下面是我最终想到的:

function getTimeStr() {
    var dt = new Date();
    var d = dt.toLocaleDateString();
    var t = dt.toLocaleTimeString();
    t = t.replace(/\u200E/g, '');
    t = t.replace(/^([^\d]*\d{1,2}:\d{1,2}):\d{1,2}([^\d]*)$/, '$1$2');
    var result = d + ' ' + t;
    return result;
}
您可以在这里尝试:

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

我假设,如果格式化的时间包含类似“XX:XX:XX”的内容,那么它一定是带秒的时间,我删除了最后一部分,如果我没有找到此模式,则不会更改任何内容。非常安全,但在某些奇怪的情况下,可能会留下秒


我只希望没有区域设置会改变格式化时间部分的顺序(例如,将其设为ss:mm:hh)。不过,这个从左到右的标记让我有点紧张,这就是为什么我不删除从右到左的标记(\u202E)-在这种情况下,我不希望找到匹配项,而在这种情况下,时间的格式为秒。

我认为最初的问题很容易回答,但到目前为止忽略了一点:一个简单的字符串拆分。返回的时间是一个文本字符串,只需在“:”上拆分即可分隔符并按您想要的方式重新组合字符串。无需插件,无需复杂的脚本编写。现在开始:

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;
}

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

这种方法使用regex look-ahead来获取字符串的:ss AM/PM端,并用空格替换:ss部分,返回未触及的字符串的其余部分(字面意思是“找到一个带有两个数字的冒号和一个后跟AM或PM的空格,并用一个空格替换冒号、两个数字和空格部分)

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


根据原始提问者的样本输出,我假设他们主要是针对美国观众和美国时间模式。

你可以试试这个,这符合我的需要

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


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

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

var date = new Date();
date.toLocaleTimeString('fr-FR', {hour: '2-digit', minute: '2-digit'})
这对我很有用:

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


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

var dateWithoutSecond = new Date();
dateWithoutSecond.toLocaleTimeString([], {year: 'numeric', month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit'});
它产生了以下产出:

2020年7月29日,下午2:46


这正是我所需要的。在FireFox中工作。

不要解析从toLocaleTimeString返回的字符串。我已经有几年没有遇到任何问题了。但是今天我注意到它不起作用。结果是有一些特殊的unicode字符(例如0x200E,从左到右的标记)Date.parse无法处理它。我从来没有想到会发生这种情况。因此我将停止使用所有区域设置函数,只构建我自己的时间格式字符串。这将使我免于像这样的意外事件。@GabeHalsmer-i没有,也从来没有,建议允许Date.parse解析字符串(例如,最后一段).但这在这里并不重要,根本没有提到,如果你认为答案是错的,那么你就理解错了(例如,“你可以尝试解析…”).很好的链接。总之,人们必须进行自己的解析或自己的ToString方法,因为Date.prototype.toLocalString和Date.parse基本上是不兼容的。对我来说,创建ToString似乎是最简单的事情。但你已经实现了自己的解析。因此,两者都适用于人们。这是我想要的基本东西让每个人都知道的是Date.parse不适用于toLocaleString。我花了几个小时来追踪这种不兼容,因为它是多么微妙。从左到右的标记在Visual Studio的调试器中是看不见的。很酷,又一次完全被误导的否决投票。难怪人们不想把自己的名字写在他们的名字上。为了存储和其他原因将日期传输到其他格式,例如toISOString和getTime
var date = new Date();
var string = date.toLocaleTimeString([], {timeStyle: 'short'});

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