Chuyển đổi giây thành HH-MM-SS bằng JavaScript?


Câu trả lời:


110

Bạn không biết datejs ? nó là phải biết

Sử dụng datejs, chỉ cần viết một cái gì đó như:

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

- ngày

Ngày nay date.js đã lỗi thời và không được duy trì, vì vậy hãy sử dụng " Moment.js ", điều này tốt hơn nhiều như được chỉ ra bởi TJ Crowder.

- ngày 2

Vui lòng sử dụng @ Frank là giải pháp một dòng:

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

Đó là giải pháp tốt nhất.


11
@Yassir và Cleiton: FWIW, DateJS đã không được duy trì trong nhiều năm và có một vài lỗi nổi bật (mặc dù theo hiểu biết của tôi, chúng chủ yếu liên quan đến phân tích cú pháp và nửa đêm). Khoảnh khắc có vẻ khá tốt, và hiện đang được duy trì.
TJ Crowder

1
@Cleiton, câu trả lời cập nhật của bạn không đầy đủ. Tôi đã thử nó như là và có : TypeError: Object [object Date] has no method 'clearTime'.
Hamish Grubijan

19
Được cấp Moment.js không lớn lắm nhưng nếu tất cả những gì bạn đang làm với nó là chuyển đổi giây thành hh: mm: ss, thì có vẻ như hơi quá mức. Thay vì sử dụng một trong các chức năng được đề xuất trong những câu trả lời này hoặc khác.
Ola Karlsson

5
Tôi nghĩ rằng giải pháp khác tốt hơn là ném một thư viện js khác vào hỗn hợp.
Donato

4
Thêm thư viện cho một hành động đơn giản tôi nghĩ không nên chấp nhận câu trả lời. Vâng, điều này hoạt động, nhưng có giải pháp tốt hơn !!!
Andris

405

Bạn có thể quản lý để thực hiện việc này mà không cần bất kỳ thư viện JavaScript bên ngoài nào với sự trợ giúp của phương pháp Ngày JavaScript như sau:

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

Hoặc, theo nhận xét của @Frank ; một lớp lót:

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

39
Tôi không biết tại sao mọi người lại thêm thư viện hoặc làm toán bằng tay khi cách này hoạt động hoàn hảo. Cảm ơn!
jminardi

98
Điều này thậm chí có thể được rút ngắn thành một dòng: new Date(SECONDS * 1000).toISOString().substr(11, 8);
Frank

4
Xuất sắc. Nếu không có lib bên thứ 3. Tốt nhất
Riz

41
Vấn đề với phương pháp này là nó sẽ tràn sau 24 giờ, khiến bạn không thể hiển thị quá thời gian này. Giải pháp hoàn hảo nếu bạn có ít hơn 24 giờ trong vài giây.
Renato Gama

1
Điều này không hoạt động với tôi trong IE11, tôi nhận đượcObject doesn't support property or method 'toISOString'
NibblyPig

153

Tôi không nghĩ rằng bất kỳ tính năng tích hợp nào của đối tượng Ngày chuẩn sẽ thực hiện điều này cho bạn theo cách thuận tiện hơn là tự mình làm toán.

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

Thí dụ:


Có một số vấn đề với điều này tôi nghĩ? Khi tôi thử nó, tôi đã nhận được số thập phân trở lại, vì vậy 180 giây sẽ trở lại 0.05trong hoursbiến. Tôi đặt nó bên trong một parseIntcái đã sửa nó cho trường hợp của tôi, nhưng tôi không nghĩ rằng nó chính xác cho mọi thứ. Tuy nhiên, điều này đã giúp tôi, vì vậy cảm ơn!
BT643

@ BT643: Điều lạ là tôi đã không xử lý việc đó. Bây giờ tôi đã làm như vậy, bạn không muốn sử dụng parseIntnó, đó là để phân tích chuỗi , không thao tác số. Math.floorsẽ là hoạt động có liên quan ở đây.
TJ Crowder

1
À, được rồi! Thay đổi mã của tôi. Mặc dù bạn có thể muốn nó vào giây seconds = Math.floor(totalSeconds % 60);. Tôi chỉ có một kết quả thập phân ở đó quá.
BT643

@ BT643: totalSeconds % 60chỉ có thể có một phần phân số nếu totalSecondscó một phần phân số. Cho dù bạn muốn lên sàn, nó sẽ phụ thuộc vào việc bạn muốn mất thông tin đó hay giữ lại thông tin đó. (Các hoạt động sàn khác mà chúng tôi đang thực hiện không làm mất bất kỳ thông tin nào, vì họ chỉ xóa dữ liệu sẽ kết thúc minutesseconds.)
TJ Crowder

8
@HannounYassirconsole.log( hours +':'+ ('0'+minutes).slice(-2) +':'+ ('0'+seconds).slice(-2) );
Xavi Esteve

60

Tôi biết điều này hơi cũ, nhưng ...

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

Nó sẽ xuất ra:

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

2
Còn phân số của một giây thì sao? 03: 45: 45.xxx?
Mike Stoddart

1
@ SantiagoHernández Tuyệt vời! Điều này bây giờ hoạt động hoàn hảo cho thời gian hơn 24 giờ.
Stefnotch

2
+1. Đây hoặc TJ phải là câu trả lời được chấp nhận, vì đó là những câu trả lời duy nhất hoạt động trong các tình huống khi thời lượng vượt quá 24 giờ (và câu hỏi không giới hạn thời lượng).
George Y.

38

Như Cleiton đã chỉ ra trong câu trả lời của mình , khoảnh khắc có thể được sử dụng cho việc này:

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

5
Điều gì xảy ra nếu số giây vượt quá một ngày?
Gilad Peleg

3
@GiladPeleg nếu số giây vượt quá một ngày, số ngày được tính trong nội bộ và nó sẽ chỉ trả về số giờ, phút và giây còn lại. Nếu bạn muốn đếm số ngày là tốt, bạn có thể thử moment().startOf('year').seconds(30000000).format('DDD HH:mm:ss').
elquimista

9
Điều gì xảy ra nếu số giây vượt quá một năm?
OrangePot

3
@OrangePot nếu số giây vượt quá một năm, số năm được tính trong nội bộ và nó sẽ chỉ trả về các ngày, giờ, phút và giây còn lại. Nếu bạn cũng muốn đếm số năm, bạn có thể thử.format('YYYY DDD HH:mm:ss')
David Callanan

1
Nhưng điều này không thể được thực hiện tùy chọn. Điều đó có thể trông xấu xí.
shaedrich

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

2
định dạng giây (3919); // Trả về 01:05:19 Chức năng tuyệt vời .. Thích nó
Samrat Saha

17

Đây là mẹo:

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

(Nguồn từ đây )


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

chúng ta có thể làm cho hàm này ngắn hơn và rõ nét hơn nhưng điều đó làm giảm khả năng đọc, vì vậy chúng ta sẽ viết nó đơn giản nhất có thể và ổn định nhất có thể.

hoặc bạn có thể kiểm tra điều này làm việc ở đây :


hơn nữa ... nếu bạn muốn làm mọi thứ một cách dễ dàng .. sử dụng khoảnh khắcJS
Sheelpriy

Cảm ơn! không cần đưa Thư viện vào phần mở rộng trình duyệt. Đơn giản và hiệu quả!
Arlo

9

Thử cái này:

function toTimeString(seconds) {
  return (new Date(seconds * 1000)).toUTCString().match(/(\d\d:\d\d:\d\d)/)[0];
}

7

Đây là một phần mở rộng cho lớp Number. toHHMMSS () chuyển đổi giây thành chuỗi 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

Phiên bản dễ theo dõi cho người mới:

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

5

Chức năng này sẽ làm điều đó:

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

Không vượt qua dấu phân cách, nó sử dụng :như dấu phân cách (mặc định):

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

Nếu bạn muốn sử dụng -như một dấu phân cách, chỉ cần chuyển nó làm tham số thứ hai:

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

Xem thêm Fiddle này .


Có thể sử dụng các tham số mặc định như (input, separator = ":"). Ngoài ra, nó không trả lại bất cứ thứ gì cho đến khi tôi sửa đổi nó một chút dán.ee / p / FDNag
madprops 24/03/18

@madprops: Trên thực tế, phiên bản trong câu trả lời của tôi đã được đặt :làm mặc định cho separatortham số, như tôi đã giải thích. Điều này được thực hiện bởi tuyên bố typeof separator !== 'undefined' ? separator : ':'. Ngoài ra, chức năng của bạn khá giống với tôi lưu một số thay đổi mỹ phẩm và cả hai sẽ tạo ra cùng một đầu ra ... ngoại trừ phiên bản của tôi có hỗ trợ trình duyệt tốt hơn nhiều. Bạn sẽ không làm việc trong BẤT K version phiên bản Internet Explorer hoặc MS Edge <14.
John Slegers


5

Đối với trường hợp đặc biệt của HH: MM: SS.MS (eq: "00: 04: 33.637") như FFMPEG sử dụng để chỉ định mili giây .

[-] [HH:] MM: SS [.m ...]

HH biểu thị số giờ, MM số phút cho tối đa 2 chữ số và SS số giây cho tối đa 2 chữ số. M ở cuối biểu thị giá trị thập phân cho SS.

/* HH:MM:SS.MS to (FLOAT)seconds ---------------*/
function timerToSec(timer){
   let vtimer = timer.split(":")
   let vhours = +vtimer[0]
   let vminutes = +vtimer[1]
   let vseconds = parseFloat(vtimer[2])
   return vhours * 3600 + vminutes * 60 + vseconds
}

/* Seconds to (STRING)HH:MM:SS.MS --------------*/
function secToTimer(sec){
  let o = new Date(0)
  let p =  new Date(sec*1000)  
  return new Date(p.getTime()-o.getTime())
    .toISOString()
    .split("T")[1]
    .split("Z")[0]
}

/* Example: 7hours, 4 minutes, 33 seconds and 637 milliseconds */
const t = "07:04:33.637"
console.log(
  t + " => " +
  timerToSec(t) +
  "s"
)

/* Test: 25473 seconds and 637 milliseconds */
const s = 25473.637 // "25473.637"
console.log(
  s + "s => " + 
  secToTimer(s)
)

Ví dụ sử dụng, bộ đếm thời gian vận chuyển mili giây:

/* Seconds to (STRING)HH:MM:SS.MS --------------*/
function secToTimer(sec){
  let o = new Date(0)
  let p =  new Date(sec*1000)  
  return new Date(p.getTime()-o.getTime())
    .toISOString()
    .split("T")[1]
    .split("Z")[0]
}

let job, origin = new Date().getTime()
const timer = () => {
  job = requestAnimationFrame(timer)
  OUT.textContent = secToTimer((new Date().getTime() - origin) / 1000)
}

requestAnimationFrame(timer)
span {font-size:4rem}
<span id="OUT"></span>
<br>
<button onclick="origin = new Date().getTime()">RESET</button>
<button onclick="requestAnimationFrame(timer)">RESTART</button>
<button onclick="cancelAnimationFrame(job)">STOP</button>

Ví dụ sử dụng, liên kết với một yếu tố truyền thông

/* Seconds to (STRING)HH:MM:SS.MS --------------*/
function secToTimer(sec){
  let o = new Date(0)
  let p =  new Date(sec*1000)  
  return new Date(p.getTime()-o.getTime())
    .toISOString()
    .split("T")[1]
    .split("Z")[0]
}

VIDEO.addEventListener("timeupdate", function(e){
  OUT.textContent = secToTimer(e.target.currentTime)
}, false)
span {font-size:4rem}
<span id="OUT"></span><br>
<video id="VIDEO" width="400" controls autoplay>
  <source src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4">
</video>


Ngoài câu hỏi, các hàm được viết bằng php:

<?php 
/* HH:MM:SS to (FLOAT)seconds ------------------*/
function timerToSec($timer){
  $vtimer = explode(":",$timer);
  $vhours = (int)$vtimer[0];
  $vminutes = (int)$vtimer[1];
  $vseconds = (float)$vtimer[2];
  return $vhours * 3600 + $vminutes * 60 + $vseconds;
}
/* Seconds to (STRING)HH:MM:SS -----------------*/
function secToTimer($sec){
  return explode(" ", date("H:i:s", $sec))[0];  
}

1
Bạn có thể bỏ qua + "." + p.getMilliseconds()chỉ bằng cách sử dụng new Date(p.getTime()-o.getTime()).toISOString().split("T")[1].split("Z")[0]
JayJay

1
Có vẻ ổn, có phiên bản của bạn nhanh hơn: Xem điểm chuẩn jsben.ch/4sQY1 Chỉnh sửa được chấp nhận! Cảm ơn bạn.
NVRM

4
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.
    }
}

4

Tôi chỉ muốn đưa ra một lời giải thích cho câu trả lời tốt đẹp ở trên:

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

Trên dòng thứ hai, vì có 3600 giây trong 1 giờ, chúng tôi chia tổng số giây cho 3600 để có được tổng số giờ. Chúng tôi sử dụng parseInt để loại bỏ bất kỳ số thập phân. Nếu TotalSec là 12600 (3 giờ rưỡi), thì parseInt (TotalSec / 3600) sẽ trả về 3, vì chúng ta sẽ có 3 giờ đầy đủ. Tại sao chúng ta cần% 24 trong trường hợp này? Nếu chúng tôi vượt quá 24 giờ, giả sử chúng tôi có 25 giờ (90000 giây), thì modulo ở đây sẽ đưa chúng tôi trở lại 1 lần nữa, thay vì quay lại 25. Đó là giới hạn kết quả trong giới hạn 24 giờ, vì có 24 giờ một ngày nào đó.

Khi bạn thấy một cái gì đó như thế này:

25 % 24

Hãy nghĩ về nó như thế này:

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

4

Tìm hiểu về chủ đề cũ này - OP đã nêu HH: MM: SS và nhiều giải pháp hoạt động, cho đến khi bạn nhận ra mình cần hơn 24 giờ được liệt kê. Và có lẽ bạn không muốn nhiều hơn một dòng mã. Ở đây bạn đi:

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

Nó trả về H +: MM: SS. Để sử dụng nó, chỉ cần sử dụng:

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

... Tôi đã cố gắng để nó sử dụng ít mã nhất có thể, cho cách tiếp cận một lớp tốt.


1
Bạn có thể cung cấp một phiên bản mở rộng / đọc mã của bạn để chúng tôi có thể dễ dàng thấy những gì đang xảy ra không? Cảm ơn.
Kimball

3

Bạn đã thử thêm giây vào một đối tượng Date chưa?

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

Một mẫu: https://jsfiddle.net/j5g2p0dc/5/

Đã cập nhật: Liên kết mẫu bị thiếu nên tôi đã tạo một liên kết mới.


Uncaught TypeError: dt.addSeconds không phải là một chức năng
Ikrom

@ Tôi kiểm tra mẫu, tôi đã tạo một cái mới trong jsfiddle vì cái cũ trả về lỗi 404
kpull1

Có vẻ như tôi đã không tiết lộ rằng bạn đang sử dụng phương thức tùy chỉnh addSecondstrên đối tượng Date như thế nào Date.prototype.addSeconds = function(seconds){...}. Vâng, nó hoạt động, cảm ơn đã cập nhật.
Ikrom

2

Đây là một chức năng để chuyển đổi giây thành định dạng hh-mm-ss dựa trên câu trả lời của powtac tại đây

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

Ví dụ sử dụng

var seconds = SecondsTohhmmss(70);
console.log(seconds);
// logs 00-01-10

2

Sau khi xem tất cả các câu trả lời và không hài lòng với hầu hết trong số họ, đây là những gì tôi nghĩ ra. Tôi biết tôi đến cuộc trò chuyện rất muộn, nhưng dù sao thì đây cũng là một cuộc trò chuyện.

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

Tôi tạo một đối tượng Ngày mới, thay đổi thời gian thành các tham số của mình, chuyển đổi Đối tượng Ngày thành chuỗi thời gian và xóa nội dung bổ sung bằng cách tách chuỗi và chỉ trả lại phần cần.

Tôi nghĩ rằng tôi sẽ chia sẻ cách tiếp cận này, vì nó loại bỏ nhu cầu về nhào lộn regex, logic và toán học để có được kết quả ở định dạng "HH: mm: ss", và thay vào đó nó dựa vào các phương thức được xây dựng.

Bạn có thể muốn xem tài liệu ở đây: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date


2

Có rất nhiều tùy chọn để giải quyết vấn đề này, và rõ ràng có những lựa chọn tốt được đề xuất, nhưng tôi muốn thêm một mã được tối ưu hóa hơn ở đây

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

nếu bạn không muốn định dạng 0 với ít hơn 10 số, bạn có thể sử dụng

function formatSeconds(sec) {
  return parseInt(sec / 3600) + ':' + parseInt((sec % 3600) / 60) + ':' + parseInt((sec % 3600) % 60);

}

Mã mẫu http://fiddly.org/1c476/1


2

Trong một dòng, sử dụng giải pháp của TJ Crowder:

secToHHMMSS = seconds => `${Math.floor(seconds / 3600)}:${Math.floor((seconds % 3600) / 60)}:${Math.floor((seconds % 3600) % 60)}`

Trong một dòng, một giải pháp khác cũng tính ngày:

secToDHHMMSS = seconds => `${parseInt(seconds / 86400)}d ${new Date(seconds * 1000).toISOString().substr(11, 8)}`

Nguồn: 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

Bạn cũng có thể sử dụng mã dưới đây:

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


1

Đối với bất kỳ ai sử dụng AngularJS, một giải pháp đơn giản là lọc giá trị bằng API ngày , chuyển đổi mili giây thành chuỗi dựa trên định dạng được yêu cầu. Thí dụ:

<div>Offer ends in {{ timeRemaining | date: 'HH:mm:ss' }}</div>

Lưu ý rằng điều này mong đợi một phần nghìn giây, vì vậy bạn có thể muốn nhân thời gian với 1000 nếu bạn chuyển đổi từ giây (vì câu hỏi ban đầu đã được hình thành).


1

Tôi gặp phải trường hợp một số người đã đề cập đến việc số giây nhiều hơn một ngày. Đây là phiên bản phù hợp của câu trả lời được xếp hạng hàng đầu của @Harish Anchu, chiếm thời gian dài hơn:

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

Thí dụ:

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

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

Ví dụ sử dụng

alert("186".toHHMMSS());

1

Không có câu trả lời nào ở đây thỏa mãn yêu cầu của tôi vì tôi muốn có thể xử lý

  1. Số lượng lớn giây (ngày) và
  2. Số âm

Mặc dù những điều đó không được OP yêu cầu, nhưng đó là cách thực hành tốt để bao quát các trường hợp cạnh, đặc biệt là khi mất ít công sức.

Một điều khá rõ ràng là OP có nghĩa là SỐ giây khi anh ta nói giây . Tại sao sẽ chốt chức năng của bạn trên 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)trả về 6.00:05:51trong khi tôi nghĩ nó sẽ trả về00:02:29:51
user1063287

0

Tôi đã sử dụng mã này trước đây để tạo một đối tượng thời gian đơn giản:

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

1
kết quả lặp là một kỹ thuật mã hóa rất tệ và không bao giờ được sử dụng, nó sẽ làm tăng khả năng xử lý của bạn và cung cấp cho bạn một trang web bị lag
yan bellavance 17/03/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.