用JavaScript将秒转换为HH-MM-SS?

394

如何使用JavaScript将秒数转换为HH-MM-SS格式的字符串?


3
请看我在https://dev59.com/JG015IYBdhLWcg3w7wMW#6313008的回答。 - powtac
38个回答

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

1
非常好的解决方案!这似乎是最适合我情况的。即使是00,我也始终需要HH显示:谢谢。 - Jessica
24小时以上的秒数也能很好地工作。 - Neo

3

这里的所有答案都不符合我的要求,因为我想能够处理:

  1. 大量秒数(天数),以及
  2. 负数

虽然这些并不是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

1
secondsToTimeSpan(8991) returns 6.00:05:51 whereas i think it should return 00:02:29:51 - user1063287

2
这里有一个将秒数转换为hh:mm:ss格式的函数,基于powtac在这里的答案。 jsfiddle
/** 
 * 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

2
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));

2

你尝试过给一个日期对象添加秒吗?

Date.prototype.addSeconds = function(seconds) {
    this.setSeconds(this.getSeconds() + seconds);
};
var dt = new Date();
dt.addSeconds(1234);

一个示例: https://jsfiddle.net/j5g2p0dc/5/

更新: 示例链接丢失,因此我创建了一个新链接。


未捕获的 TypeError: dt.addSeconds 不是一个函数。 - Ikrom
@Ikrom,请查看示例,我在jsfiddle上创建了一个新的,因为旧的返回404错误。 - kpull1
看起来我没有意识到你正在使用自定义方法 addSeconds 在 Date 对象上,就像 Date.prototype.addSeconds = function(seconds){...}。是的,它有效,感谢更新。 - Ikrom

2
使用T.J. Crowder的解决方案,一行代码实现:
secToHHMMSS = 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


2

有很多解决这个问题的选项,显然有一些好的建议,但我想在这里添加一个更优化的代码

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

示例代码 http://fiddly.org/1c476/1


1

您也可以使用以下代码:

int ss = nDur%60;
nDur   = nDur/60;
int mm = nDur%60;
int hh = nDur/60;

1

我遇到了一些人提到的情况,即秒数超过一天。这是@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'

1
你可以使用ES6生成器来创建高度可定制的时间字符串。
以下是将数字转换为给定比例数组的通用函数:

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秒"

总之,这是一种高度可定制的将数字转换为缩放数组的方法,可以用于时间字符串转换、人类可读的字节转换甚至纸币的兑换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接