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

问题描述 投票:191回答:33

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

javascript date time date-format time-format
33个回答
103
投票

你不知道datejs?这是必须知道的。

使用datejs,只需写下:

(new Date).clearTime()
          .addSeconds(15457)
          .toString('H:mm:ss');

--update

现在date.js已经过时而没有维护,所以请使用“Moment.js”,正如T.J所指出的要好得多。克劳德。


6
投票

这是Number类的扩展。 toHHMMSS()将秒转换为hh:mm:ss字符串。

Number.prototype.toHHMMSS = function() {
  var hours = Math.floor(this / 3600) < 10 ? ("00" + Math.floor(this / 3600)).slice(-2) : Math.floor(this / 3600);
  var minutes = ("00" + Math.floor((this % 3600) / 60)).slice(-2);
  var seconds = ("00" + (this % 3600) % 60).slice(-2);
  return hours + ":" + minutes + ":" + seconds;
}

// Usage: [number variable].toHHMMSS();

// Here is a simple test
var totalseconds = 1234;
document.getElementById("timespan").innerHTML = totalseconds.toHHMMSS();
// HTML of the test
<div id="timespan"></div>

5
投票

易于理解的新手版本:

 var totalNumberOfSeconds = YOURNUMBEROFSECONDS;
 var hours = parseInt( totalNumberOfSeconds / 3600 );
 var minutes = parseInt( (totalNumberOfSeconds - (hours * 3600)) / 60 );
 var seconds = Math.floor((totalNumberOfSeconds - ((hours * 3600) + (minutes * 60))));
 var result = (hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds  < 10 ? "0" + seconds : seconds);
 console.log(result);

4
投票

我只想对上面的好答案给出一点解释:

var totalSec = new Date().getTime() / 1000;
var hours = parseInt( totalSec / 3600 ) % 24;
var minutes = parseInt( totalSec / 60 ) % 60;
var seconds = totalSec % 60;

var result = (hours < 10 ? "0" + hours : hours) + "-" + (minutes < 10 ? "0" + minutes : minutes) + "-" + (seconds  < 10 ? "0" + seconds : seconds);

在第二行,由于1小时内有3600秒,我们将总秒数除以3600以获得总小时数。我们使用parseInt去除任何小数。如果totalSec是12600(3个半小时),那么parseInt(totalSec / 3600)将返回3,因为我们将有3个小时。在这种情况下,为什么我们需要%24?如果我们超过24小时,假设我们有25小时(90000秒),那么这里的模数将再次回到1,而不是返回25.它将结果限制在24小时限制内,因为有24小时一天内。

当你看到这样的事情:

25 % 24

可以这样想:

25 mod 24 or what is the remainder when we divide 25 by 24

4
投票

这个功能应该这样做:

var convertTime = function (input, separator) {
    var pad = function(input) {return input < 10 ? "0" + input : input;};
    return [
        pad(Math.floor(input / 3600)),
        pad(Math.floor(input % 3600 / 60)),
        pad(Math.floor(input % 60)),
    ].join(typeof separator !== 'undefined' ?  separator : ':' );
}

在不传递分隔符的情况下,它使用:作为(默认)分隔符:

time = convertTime(13551.9941351); // --> OUTPUT = 03:45:51

如果你想使用-作为分隔符,只需将它作为第二个参数传递:

time = convertTime(1126.5135155, '-'); // --> OUTPUT = 00-18-46

另见this Fiddle


4
投票

在这个老线程中说道 - OP说明了HH:MM:SS,并且许多解决方案都有效,直到你意识到你需要超过24小时列出。也许你不需要多行代码。干得好:

d=(s)=>{f=Math.floor;g=(n)=>('00'+n).slice(-2);return f(s/3600)+':'+g(f(s/60)%60)+':'+g(s%60)}

它返回H +:MM:SS。要使用它,只需使用:

d(91260);     // returns "25:21:00"
d(960);       // returns "0:16:00"

...我尝试使用尽可能少的代码,以获得一个很好的单行方法。


4
投票

下面是给定的代码,它将秒转换为hh-mm-ss格式:

var measuredTime = new Date(null);
measuredTime.setSeconds(4995); // specify value of SECONDS
var MHSTime = measuredTime.toISOString().substr(11, 8);

Convert seconds to HH-MM-SS format in JavaScript获取替代方法


3
投票
var time1 = date1.getTime();
var time2 = date2.getTime();
var totalMilisec = time2 - time1;

alert(DateFormat('hh:mm:ss',new Date(totalMilisec)))

 /* ----------------------------------------------------------
 *  Field        | Full Form          | Short Form
 *  -------------|--------------------|-----------------------
 *  Year         | yyyy (4 digits)    | yy (2 digits)
 *  Month        | MMM (abbr.)        | MM (2 digits)
                 | NNN (name)         |
 *  Day of Month | dd (2 digits)      | 
 *  Day of Week  | EE (name)          | E (abbr)
 *  Hour (1-12)  | hh (2 digits)      | 
 *  Minute       | mm (2 digits)      | 
 *  Second       | ss (2 digits)      | 
 *  ----------------------------------------------------------
 */
function DateFormat(formatString,date){
    if (typeof date=='undefined'){
    var DateToFormat=new Date();
    }
    else{
        var DateToFormat=date;
    }
    var DAY         = DateToFormat.getDate();
    var DAYidx      = DateToFormat.getDay();
    var MONTH       = DateToFormat.getMonth()+1;
    var MONTHidx    = DateToFormat.getMonth();
    var YEAR        = DateToFormat.getYear();
    var FULL_YEAR   = DateToFormat.getFullYear();
    var HOUR        = DateToFormat.getHours();
    var MINUTES     = DateToFormat.getMinutes();
    var SECONDS     = DateToFormat.getSeconds();

    var arrMonths = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
    var arrDay=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
    var strMONTH;
    var strDAY;
    var strHOUR;
    var strMINUTES;
    var strSECONDS;
    var Separator;

    if(parseInt(MONTH)< 10 && MONTH.toString().length < 2)
        strMONTH = "0" + MONTH;
    else
        strMONTH=MONTH;
    if(parseInt(DAY)< 10 && DAY.toString().length < 2)
        strDAY = "0" + DAY;
    else
        strDAY=DAY;
    if(parseInt(HOUR)< 10 && HOUR.toString().length < 2)
        strHOUR = "0" + HOUR;
    else
        strHOUR=HOUR;
    if(parseInt(MINUTES)< 10 && MINUTES.toString().length < 2)
        strMINUTES = "0" + MINUTES;
    else
        strMINUTES=MINUTES;
    if(parseInt(SECONDS)< 10 && SECONDS.toString().length < 2)
        strSECONDS = "0" + SECONDS;
    else
        strSECONDS=SECONDS;

    switch (formatString){
        case "hh:mm:ss":
            return strHOUR + ':' + strMINUTES + ':' + strSECONDS;
        break;
        //More cases to meet your requirements.
    }
}

3
投票

您是否尝试过添加Date对象?

var dt = new Date();
dt.addSeconds(1234);

一个样本:https://jsfiddle.net/j5g2p0dc/5/

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


2
投票

这是一个基于powtac的答案here将秒转换为hh-mm-ss格式的功能

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
投票

在查看了所有答案并且对大多数答案都不满意之后,这就是我想出来的。我知道我的谈话已经很晚了,但无论如何它都在这里。

function secsToTime(secs){
  var time = new Date(); 
  // create Date object and set to today's date and time
  time.setHours(parseInt(secs/3600) % 24);
  time.setMinutes(parseInt(secs/60) % 60);
  time.setSeconds(parseInt(secs%60));
  time = time.toTimeString().split(" ")[0];
  // time.toString() = "HH:mm:ss GMT-0800 (PST)"
  // time.toString().split(" ") = ["HH:mm:ss", "GMT-0800", "(PST)"]
  // time.toTimeString().split(" ")[0]; = "HH:mm:ss"
  return time;
}

我创建一个新的Date对象,将时间更改为我的参数,将Date对象转换为时间字符串,并通过拆分字符串并仅返回需要的部分来删除其他内容。

我想我会分享这种方法,因为它不需要正则表达式,逻辑和数学杂技来获得“HH:mm:ss”格式的结果,而是依赖于内置方法。

您可以在这里查看文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date


318
投票

您可以使用JavaScript Date方法在没有任何外部JavaScript库的情况下执行此操作,如下所示:

var date = new Date(null);
date.setSeconds(SECONDS); // specify value for SECONDS here
var result = date.toISOString().substr(11, 8);

或者,根据@Frank的评论;一个班轮:

new Date(SECONDS * 1000).toISOString().substr(11, 8);

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


2
投票

在一行中,使用T.J.克劳德的解决方案:

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

1
投票

您还可以使用以下代码:

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

1
投票

对于使用AngularJS的任何人来说,一个简单的解决方案是使用date API过滤值,<div>Offer ends in {{ timeRemaining | date: 'HH:mm:ss' }}</div> 根据请求的格式将毫秒转换为字符串。例:

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

请注意,这需要毫秒,因此如果您从秒转换(因为原始问题已经制定),您可能希望将timeRemaining乘以1000。


1
投票

我碰到了一些人提到的案例,其中秒数超过一天。这是@Harish Anchu最受欢迎的答案的改编版本,可以解释更长的时间:

secondsToTime(101596) // outputs '28:13:16' as opposed to '04:13:16'

例:

String.prototype.toHHMMSS = function () {
    var sec_num = parseInt(this, 10); // don't forget the second param
    var hours   = Math.floor(sec_num / 3600);
    var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
    var seconds = sec_num - (hours * 3600) - (minutes * 60);

    if (hours   < 10) {hours   = "0"+hours;}
    if (minutes < 10) {minutes = "0"+minutes;}
    if (seconds < 10) {seconds = "0"+seconds;}
    return hours+':'+minutes+':'+seconds;
}

1
投票
alert("186".toHHMMSS());

用法示例

function TimeSpan(time) {
this.hours = 0;
this.minutes = 0;
this.seconds = 0;

while(time >= 3600)
{
    this.hours++;
    time -= 3600;
}

while(time >= 60)
{
    this.minutes++;
    time -= 60;
}

this.seconds = time;
}

var timespan = new Timespan(3662);

0
投票

我之前使用过这段代码来创建一个简单的时间跨度对象:

new Date().toString().split(" ")[4];

0
投票

15:08:03

结果var Convert = function (time) { const HOUR = 60 * 60; const MINUTE = 60; var minutesInSeconds = time % HOUR; var hours = Math.floor(time / HOUR); var minutes = Math.floor(minutesInSeconds / MINUTE) var seconds = minutesInSeconds % MINUTE; return hours.padStart(2, 0) + ':' + minutes.padStart(2, 0) + ':' + seconds.padStart(2, 0); }


0
投票

也许是这样的:

String

123
投票

我认为标准Date对象的任何内置功能都不会以比自己进行数学运算更方便的方式为您执行此操作。

hours = Math.floor(totalSeconds / 3600);
totalSeconds %= 3600;
minutes = Math.floor(totalSeconds / 60);
seconds = totalSeconds % 60;

例:

let totalSeconds = 28565;
let hours = Math.floor(totalSeconds / 3600);
totalSeconds %= 3600;
let minutes = Math.floor(totalSeconds / 60);
let seconds = totalSeconds % 60;

console.log("hours: " + hours);
console.log("minutes: " + minutes);
console.log("seconds: " + seconds);

// If you want strings with leading zeroes:
minutes = String(minutes).padStart(2, "0");
hours = String(hours).padStart(2, "0");
seconds = String(seconds).padStart(2, "0");
console.log(hours + ":" + minutes + ":" + seconds);

0
投票

这里的答案都没有满足我的要求,因为我希望能够处理

  1. 大量的秒(天)和
  2. 负数

虽然OP不需要这些,但是覆盖边缘情况是一种很好的做法,特别是在需要很少工作的情况下。

很明显,当他说秒时,OP意味着数秒。为什么要把你的功能挂在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 上?

qazxswpoi

31
投票

正如Cleiton在his answer指出的那样,moment.js可用于此:

moment().startOf('day')
        .seconds(15457)
        .format('H:mm:ss');

26
投票

我知道这有点老了,但......

ES2015:

var toHHMMSS = (secs) => {
    var sec_num = parseInt(secs, 10)
    var hours   = Math.floor(sec_num / 3600)
    var minutes = Math.floor(sec_num / 60) % 60
    var seconds = sec_num % 60

    return [hours,minutes,seconds]
        .map(v => v < 10 ? "0" + v : v)
        .filter((v,i) => v !== "00" || i > 0)
        .join(":")
}

它将输出:

toHHMMSS(129600) // 36:00:00
toHHMMSS(13545) // 03:45:45
toHHMMSS(180) // 03:00
toHHMMSS(18) // 00:18

19
投票
function formatSeconds(seconds)
{
    var date = new Date(1970,0,1);
    date.setSeconds(seconds);
    return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
}

15
投票

这样做的诀窍:

function secondstotime(secs)
{
    var t = new Date(1970,0,1);
    t.setSeconds(secs);
    var s = t.toTimeString().substr(0,8);
    if(secs > 86399)
        s = Math.floor((t - Date.parse("1/1/70")) / 3600000) + s.substr(2);
    return s;
}

(来自here


10
投票
     var  timeInSec = "661"; //even it can be string

            String.prototype.toHHMMSS = function () { 
               /* extend the String by using prototypical inheritance */
                var seconds = parseInt(this, 10); // don't forget the second param
                var hours   = Math.floor(seconds / 3600);
                var minutes = Math.floor((seconds - (hours * 3600)) / 60);
                seconds = seconds - (hours * 3600) - (minutes * 60);

                if (hours   < 10) {hours   = "0"+hours;}
                if (minutes < 10) {minutes = "0"+minutes;}
                if (seconds < 10) {seconds = "0"+seconds;}
                var time    = hours+':'+minutes+':'+seconds;
                return time;
            }

            alert("5678".toHHMMSS());   // "01:34:38"
            console.log(timeInSec.toHHMMSS());   //"00:11:01"

我们可以使这个功能更短更清晰,但这会降低可读性,因此我们将尽可能简单地编写并尽可能稳定。

或者你可以检查这个工作here


9
投票

试试这个:

function toTimeString(seconds) {
  return (new Date(seconds * 1000)).toUTCString().match(/(\d\d:\d\d:\d\d)/)[0];
}
© www.soinside.com 2019 - 2024. All rights reserved.