如何使用JavaScript将秒数转换为HH-MM-SS
格式的字符串?
如何使用JavaScript将秒数转换为HH-MM-SS
格式的字符串?
export const secondsToHHMMSS = (seconds) => {
const HH = `${Math.floor(seconds / 3600)}`.padStart(2, '0');
const MM = `${Math.floor(seconds / 60) % 60}`.padStart(2, '0');
const SS = `${Math.floor(seconds % 60)}`.padStart(2, '0');
return [HH, MM, SS].join(':');
};
这里的所有答案都不符合我的要求,因为我想能够处理:
虽然这些并不是OP要求的,但在涉及到很少的工作量时,覆盖边缘情况是一个好习惯。
很明显,当他说“秒”时,OP指的是秒数。为什么要将您的函数固定在String
上?
function secondsToTimeSpan(seconds) {
const value = Math.abs(seconds);
const days = Math.floor(value / 1440);
const hours = Math.floor((value - (days * 1440)) / 3600);
const min = Math.floor((value - (days * 1440) - (hours * 3600)) / 60);
const sec = value - (days * 1440) - (hours * 3600) - (min * 60);
return `${seconds < 0 ? '-':''}${days > 0 ? days + '.':''}${hours < 10 ? '0' + hours:hours}:${min < 10 ? '0' + min:min}:${sec < 10 ? '0' + sec:sec}`
}
secondsToTimeSpan(0); // => 00:00:00
secondsToTimeSpan(1); // => 00:00:01
secondsToTimeSpan(1440); // => 1.00:00:00
secondsToTimeSpan(-1440); // => -1.00:00:00
secondsToTimeSpan(-1); // => -00:00:01
secondsToTimeSpan(8991)
returns 6.00:05:51
whereas i think it should return 00:02:29:51
- user1063287/**
* Convert seconds to hh-mm-ss format.
* @param {number} totalSeconds - the total seconds to convert to hh- mm-ss
**/
var SecondsTohhmmss = function(totalSeconds) {
var hours = Math.floor(totalSeconds / 3600);
var minutes = Math.floor((totalSeconds - (hours * 3600)) / 60);
var seconds = totalSeconds - (hours * 3600) - (minutes * 60);
// round seconds
seconds = Math.round(seconds * 100) / 100
var result = (hours < 10 ? "0" + hours : hours);
result += "-" + (minutes < 10 ? "0" + minutes : minutes);
result += "-" + (seconds < 10 ? "0" + seconds : seconds);
return result;
}
使用示例
var seconds = SecondsTohhmmss(70);
console.log(seconds);
// logs 00-01-10
var sec_to_hms = function(sec){
var min, hours;
sec = sec - (min = Math.floor(sec/60))*60;
min = min - (hours = Math.floor(min/60))*60;
return (hours?hours+':':'') + ((min+'').padStart(2, '0')) + ':'+ ((sec+'').padStart(2, '0'));
}
alert(sec_to_hms(2442542));
你尝试过给一个日期对象添加秒吗?
Date.prototype.addSeconds = function(seconds) {
this.setSeconds(this.getSeconds() + seconds);
};
var dt = new Date();
dt.addSeconds(1234);
一个示例: https://jsfiddle.net/j5g2p0dc/5/
更新: 示例链接丢失,因此我创建了一个新链接。
addSeconds
在 Date 对象上,就像 Date.prototype.addSeconds = function(seconds){...}
。是的,它有效,感谢更新。 - IkromsecToHHMMSS = seconds => `${Math.floor(seconds / 3600)}:${Math.floor((seconds % 3600) / 60)}:${Math.floor((seconds % 3600) % 60)}`
secToDHHMMSS = seconds => `${parseInt(seconds / 86400)}d ${new Date(seconds * 1000).toISOString().substr(11, 8)}`
来源: https://gist.github.com/martinbean/2bf88c446be8048814cf02b2641ba276
有很多解决这个问题的选项,显然有一些好的建议,但我想在这里添加一个更优化的代码
function formatSeconds(sec) {
return [(sec / 3600), ((sec % 3600) / 60), ((sec % 3600) % 60)]
.map(v => v < 10 ? "0" + parseInt(v) : parseInt(v))
.filter((i, j) => i !== "00" || j > 0)
.join(":");
}
如果您不想在小于10的数字前显示格式化的零,则可以使用以下方法:
function formatSeconds(sec) {
return parseInt(sec / 3600) + ':' + parseInt((sec % 3600) / 60) + ':' + parseInt((sec % 3600) % 60);
您也可以使用以下代码:
int ss = nDur%60;
nDur = nDur/60;
int mm = nDur%60;
int hh = nDur/60;
我遇到了一些人提到的情况,即秒数超过一天。这是@Harish Anchu最受欢迎答案的改编版本,考虑了更长时间段:
function secondsToTime(seconds) {
const arr = new Date(seconds * 1000).toISOString().substr(11, 8).split(':');
const days = Math.floor(seconds / 86400);
arr[0] = parseInt(arr[0], 10) + days * 24;
return arr.join(':');
}
例子:
secondsToTime(101596) // outputs '28:13:16' as opposed to '04:13:16'
function toScaledArray(n,scales){
function* g(x, n=0){
if(x>0) {
yield x%(scales[n]||Infinity);
yield* g(Math.floor(x/scales[n]),n+1)
}
}
return [...g(n)]
}
console.log(toScaledArray(6,[10,10]))
console.log(toScaledArray(2000,[30,12]))
console.log(toScaledArray(45000,[24,30,12]))
> toScaledArray(45000,[60,60]).reverse().join(":")
< '12:30:0'
> toScaledArray(1234,[60,60]).reverse().join(":")
< '20:34'
[...(function* g(x,n=0,scales=[60,60]){if(x>0) {yield x%(scales[n]||Infinity); yield* g(Math.floor(x/scales[n]),n+1,scales)}})(45000)].reverse().join("-")
如果您想将字符串转换为精确的“HH-MM-SS”,上述函数将省略前导零,您可以使用以下方法:
[...(function* g(x,n=0,scales=[60,60]){if(x>0||n<3) {yield x%(scales[n]||Infinity); yield* g(Math.floor(x/scales[n]),n+1,scales)}})(45000)].reverse().map(x=>String(x).padStart(2, '0')).join("-")
此外,如果你需要的是 '[H:]MM:SS' 格式,我们这里有:
Number.prototype.toTimeString = function(){
return [...(function* g(x,n=0,scales=[60,60]){if(x>0||n<2) {yield x%(scales[n]||Infinity); yield* g(Math.floor(x/scales[n]),n+1,scales)}})(this)].map((x,n)=>n<2?String(x).padStart(2,'0'):x).reverse().join(":")
}
console.log(12,(12).toTimeString())
console.log(345,(345).toTimeString())
console.log(6789,(6789).toTimeString())
你还可以像下面这样使用D(日)
、M(月)
和Y(年)
(虽然不是非常精确):
> toScaledArray(123456789,[60,60,24,30,12]).map((x,n)=>n<2?String(x).padStart(2,'0'):x).reverse().join(":")
< '3:11:18:21:33:09'
这里的输出意思是"3年11个月18天21小时33分钟9秒"
总之,这是一种高度可定制的将数字转换为缩放数组的方法,可以用于时间字符串转换、人类可读的字节转换甚至纸币的兑换。