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

我目前试图显示用户的时间而不显示秒。是否有一种方法,我可以这样做使用Javascript的.toLocaleTimeString()?

做这样的事情:

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

将显示用户的时间与每个单位,例如,目前显示为3:39:15 PM。我是否能够显示相同的字符串,只是没有秒?(例如下午3时39分)

195883 次浏览

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

你总是可以设置选项,基于你可以设置的页面,来去掉秒,类似这样

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
}

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

要了解更多关于Javascript Date对象的信息,可以参考https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

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

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

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

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

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

我只是希望没有locale会改变格式化时间部分的顺序(例如,使它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 Internalization API):

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

这种方法使用regex前导来获取字符串的:ss AM/PM结尾,并将:ss部分替换为空格,原封不动地返回字符串的其余部分。(字面意思是“找到一个冒号,两个数字和一个空格,后面跟着AM或PM,并将冒号,两个数字和空格部分替换为一个空格)。

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

根据最初提问者的样本输出,我假设他们主要是在处理美国观众和en-US时间模式。

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

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

d.toLocaleString().replace(/:\d{2}\s/,' ');

只需将日期转换为字符串,然后连接所需的子字符串。

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

使用locale:

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。

带日期且小时无前导0:

let d = new Date(2022, 2, 21, 7, 45, 0);
let s = d.toLocaleString([], { dateStyle: 'short', timeStyle: 'short' });
console.log(s);
// '2/21/22, 7:45 AM'

所有现代浏览器都支持

我只能从用户的localeTimeString中得到小时

const americanTime = date.toLocaleTimeString("en-US", { timeZone: 'America/New_York', hour: 'numeric', hour12: false })
    

const timeInHours = americanTime;


在本例中,我使用New_York作为用户的位置。