แปลงวินาทีเป็น HH-MM-SS ด้วย JavaScript?


คำตอบ:


109

ไม่ทราบdatejs ? มันเป็นสิ่งที่ต้องรู้

ใช้ datejs เพียงแค่เขียนสิ่งที่ชอบ:

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

--update

ทุกวันนี้ date.js ล้าสมัยและไม่ได้รับการบำรุงรักษาดังนั้นให้ใช้ " Moment.js " ซึ่งดีกว่าที่ TJ Crowder ระบุไว้มาก

- ปรับปรุง 2

กรุณาใช้ @ Frank's ทางออกหนึ่งบรรทัด:

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

มันเป็นทางออกที่ดีที่สุด


11
@ Yassir and Cleiton: FWIW, DateJS ไม่ได้รับการดูแลในช่วงหลายปีที่ผ่านมาและมีข้อผิดพลาดที่โดดเด่นอยู่สองสามข้อ (ถึงความรู้ของฉัน สักครู่ดูเหมือนว่าค่อนข้างดีและยังคงอยู่ในปัจจุบัน
TJ Crowder

1
@Cleiton คำตอบที่อัพเดตของคุณไม่เต็ม ฉันลองทำตามที่เป็นอยู่และได้รับ: TypeError: Object [object Date] has no method 'clearTime'.
Hamish Grubijan

19
ที่ได้รับ Moment.js นั้นไม่ใช่เรื่องใหญ่ แต่ถ้าคุณทำทุกอย่างเพื่อแปลงวินาทีเป็น hh: mm: ss ดูเหมือนว่าจะเกินความจริงเล็กน้อย แทนที่จะใช้หนึ่งในฟังก์ชั่นที่แนะนำในคำตอบเหล่านี้หรือคำตอบอื่น ๆ
Ola Karlsson

5
ฉันคิดว่าวิธีแก้ปัญหาอื่นดีกว่าการโยน js ไลบรารี่อื่นเข้าด้วยกัน
Donato

4
การเพิ่มไลบรารี่สำหรับแอคชั่นง่ายๆเดียวฉันคิดว่าไม่ควรรับคำตอบ ใช่ใช้งานได้ แต่มีวิธีแก้ปัญหาที่ดีกว่า !!!
Andris

404

คุณสามารถจัดการกับสิ่งนี้ได้โดยไม่ต้องมีไลบรารี JavaScript ภายนอกด้วยความช่วยเหลือของวิธีการวันที่ของ 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);

39
ฉันไม่รู้ว่าทำไมทุกคนเพิ่มห้องสมุดเพิ่มเติมหรือทำคณิตศาสตร์ด้วยตนเองเมื่อมันทำงานได้อย่างสมบูรณ์ ขอบคุณ!
jminardi

98
สิ่งนี้สามารถย่อให้เหลือเพียงหนึ่งบรรทัด: new Date(SECONDS * 1000).toISOString().substr(11, 8);
Frank

4
สุกใส ไม่มี lib อื่น ๆ มันเป็นเรื่องที่ดีที่สุด
Riz

41
ปัญหาของวิธีนี้คือมันจะล้นหลังจาก 24 ชั่วโมงทำให้คุณไม่สามารถแสดงได้เกินระยะเวลานี้ โซลูชั่นที่สมบูรณ์แบบถ้าคุณมีเวลาน้อยกว่า 24 ชั่วโมงในไม่กี่วินาที
Renato Gama

1
สิ่งนี้ไม่ได้ผลสำหรับฉันใน IE11 ฉันได้รับObject doesn't support property or method 'toISOString'
NibblyPig

153

ฉันไม่คิดว่าคุณสมบัติวันที่ในตัวของวัตถุ Date มาตรฐานจะทำสิ่งนี้ให้คุณในแบบที่สะดวกกว่าการทำคณิตศาสตร์ด้วยตัวเอง

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

ตัวอย่าง:


ฉันคิดว่ามีปัญหาอะไรบ้าง? เมื่อฉันลองฉันได้รับทศนิยมกลับดังนั้น 180 วินาทีจะกลับมา0.05ที่hoursตัวแปร ฉันใส่ไว้ในparseIntที่ซึ่งมันคงที่สำหรับกรณีของฉัน แต่ฉันไม่คิดว่ามันจะถูกต้องสำหรับทุกสิ่ง ถึงกระนั้นสิ่งนี้ก็ช่วยฉันได้ขอบคุณมาก!
BT643

@ BT643: แปลกที่ฉันไม่ได้จัดการ ฉันทำไปแล้วตอนนี้คุณไม่ต้องการใช้parseIntมันสำหรับการแยกสตริงไม่ใช่การจัดการตัวเลข Math.floorจะเป็นการดำเนินการที่เกี่ยวข้องที่นี่
TJ Crowder

1
อาโอเค! เปลี่ยนรหัสของฉัน แม้ว่าคุณอาจต้องการมันในไม่กี่วินาทีเช่นกันseconds = Math.floor(totalSeconds % 60);. ฉันเพิ่งได้ผลลัพธ์ทศนิยมที่นั่นเช่นกัน
BT643

@ BT643: totalSeconds % 60สามารถมีได้เพียงบางส่วนเท่านั้นหากtotalSecondsมีส่วนที่เป็นเศษส่วน ไม่ว่าคุณต้องการปูพื้นมันจะขึ้นอยู่กับว่าคุณต้องการสูญเสียข้อมูลนั้นหรือเก็บรักษาไว้ (ส่วนปฏิบัติการอื่น ๆ ที่เรากำลังทำอยู่จะไม่สูญเสียข้อมูลใด ๆ เพราะพวกเขาเพียงแค่ล้างข้อมูลที่จะสิ้นสุดในminutesและseconds.)
TJ Crowder

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

60

ฉันรู้ว่านี่เก่านะ แต่ ...

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

2
เศษเสี้ยวของวินาทีล่ะ? 03: 45: 45.xxx?
Mike Stoddart

1
@ SantiagoHernándezเยี่ยมมาก! ตอนนี้ทำงานได้อย่างสมบูรณ์แบบนานกว่า 24 ชั่วโมง
Stefnotch

2
+1 TJ นี้หรือควรเป็นคำตอบที่ยอมรับได้เนื่องจากเป็นคำตอบเดียวที่ใช้ได้กับสถานการณ์เมื่อระยะเวลาเกิน 24 ชั่วโมง (และคำถามไม่ได้ จำกัด ระยะเวลา)
George Y.

38

ในฐานะที่เป็น Cleiton ชี้ให้เห็นในคำตอบของเขา , moment.jsสามารถนำมาใช้สำหรับการนี้:

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

5
จะเกิดอะไรขึ้นถ้าจำนวนวินาทีเกินกว่าวัน
Gilad Peleg

3
@GiladPeleg หากจำนวนวินาทีเกินกว่าวันจำนวนวันจะถูกคำนวณภายในและจะส่งคืนเฉพาะชั่วโมงนาทีและวินาทีที่เหลืออยู่เท่านั้น moment().startOf('year').seconds(30000000).format('DDD HH:mm:ss')หากคุณต้องการที่จะนับจำนวนวันเช่นกันคุณสามารถลอง
elquimista

9
จะเกิดอะไรขึ้นถ้าจำนวนวินาทีเกินกว่าหนึ่งปี
OrangePot

3
@OrangePot หากจำนวนวินาทีเกินกว่าหนึ่งปีจำนวนปีจะถูกคำนวณภายในและจะคืนเฉพาะวันชั่วโมงนาทีและวินาทีที่เหลืออยู่เท่านั้น หากคุณต้องการนับจำนวนปีเช่นกันคุณสามารถลอง.format('YYYY DDD HH:mm:ss')
David Callanan

1
แต่สิ่งนี้ไม่สามารถเลือกได้ นั่นอาจดูน่าเกลียด
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
formatSeconds (3919); // ส่งคืน 01:05:19 ฟังก์ชั่นที่ยอดเยี่ยม .. ชอบมัน
Samrat Saha

17

นี่เป็นการหลอกลวง:

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

(ที่มาจากที่นี่ )


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"

เราสามารถทำให้ฟังก์ชั่นนี้สั้นลงและคมชัดมาก แต่ลดความสามารถในการอ่านดังนั้นเราจะเขียนมันให้ง่ายที่สุดและเสถียรที่สุด

หรือคุณสามารถตรวจสอบการทำงานที่นี่ :


ยิ่งไปกว่านั้น ... ถ้าคุณต้องการที่จะทำทุกสิ่งที่วันเวลาได้อย่างง่ายดาย .. ใช้ช่วงเวลา JS
sheelpriy

ขอบคุณ! ไม่จำเป็นต้องรวม Library ไว้ในส่วนขยายของเบราว์เซอร์ ง่ายและใช้งานได้!
Arlo


7

นี่คือส่วนขยายของคลาส 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

ง่ายต่อการติดตามเวอร์ชั่นสำหรับ noobies:

 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

ฟังก์ชั่นนี้ควรทำ:

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

ดูซอนี้


สามารถใช้พารามิเตอร์เริ่มต้นเช่น (อินพุต, separator = ":") และมันก็ไม่ได้กลับมาอะไรจนกว่าฉันจะแก้ไขมันเล็กน้อยpaste.ee/p/FDNag
madprops

@madprops: อันที่จริงแล้วเวอร์ชันในคำตอบของฉันตั้ง:เป็นค่าเริ่มต้นสำหรับseparatorพารามิเตอร์ตามที่ฉันอธิบายไปแล้ว typeof separator !== 'undefined' ? separator : ':'นี้จะกระทำโดยคำสั่ง นอกจากนี้ฟังก์ชั่นของคุณเหมือนกันมากกับเหมืองบันทึกการเปลี่ยนแปลงเครื่องสำอางและพวกเขาทั้งคู่ควรสร้างผลลัพธ์เดียวกัน ... ยกเว้นรุ่นของฉันมีการสนับสนุนเบราว์เซอร์ที่ดีกว่ามาก คุณจะไม่ทำงานใน Internet Explorer หรือ MS Edge เวอร์ชันใด ๆ <14.
John Slegers

5

ด้านล่างเป็นรหัสที่กำหนดซึ่งจะแปลงวินาทีในรูปแบบ hh-mm-ss:

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

รับวิธีทางเลือกจากแปลงวินาทีเป็นรูปแบบ HH-MM-SS ใน JavaScript


คุณคัดลอกวางจากคำตอบนี้หรือไม่?
StefansArya

5

สำหรับกรณีพิเศษของHH: MM: SS.MS (EQ: "00: 04: 33.637") ที่ใช้โดยFFMPEGเพื่อระบุมิลลิวินาที

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

HH แสดงจำนวนชั่วโมง MM จำนวนนาทีสูงสุด 2 หลักและ SS จำนวนวินาทีสำหรับจำนวนสูงสุด 2 หลัก m ที่ท้ายแสดงค่าทศนิยมสำหรับ 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)
)

ตัวอย่างการใช้งานตัวจับเวลาการขนส่งเป็นมิลลิวินาที:

/* 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>

ตัวอย่างการใช้งานเชื่อมโยงกับองค์ประกอบสื่อ

/* 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>


นอกเหนือจากคำถามฟังก์ชั่นเหล่านั้นที่เขียนด้วย 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
คุณสามารถละเว้น+ "." + p.getMilliseconds()โดยใช้เพียง new Date(p.getTime()-o.getTime()).toISOString().split("T")[1].split("Z")[0]
JayJay

1
ดูเหมือนว่าใช่รุ่นของคุณเร็วขึ้น: ดูมาตรฐานjsben.ch/4sQY1 ยอมรับการแก้ไข! ขอบคุณ.
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

ฉันแค่อยากจะให้คำอธิบายเล็กน้อยกับคำตอบที่ดีข้างต้น:

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

ในบรรทัดที่สองเนื่องจากมี 3600 วินาทีใน 1 ชั่วโมงเราจึงหารจำนวนวินาทีทั้งหมดด้วย 3600 เพื่อให้ได้จำนวนชั่วโมงทั้งหมด เราใช้การแยกวิเคราะห์เพื่อตัดทศนิยมใด ๆ ถ้า 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

การตีพิมพ์ในเธรดเก่านี้ - 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"

... ฉันพยายามทำให้มันใช้รหัสน้อยที่สุดเท่าที่จะเป็นไปได้เพื่อแนวทางหนึ่งเดียวที่ดี


1
คุณสามารถให้รหัสของคุณในเวอร์ชันขยาย / อ่านได้เช่นกันเพื่อให้เราสามารถเห็นสิ่งที่เกิดขึ้นได้ง่ายขึ้น? ขอบคุณ
Kimball

3

คุณได้ลองเพิ่มวินาทีลงในวัตถุวันที่หรือไม่?

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

ตัวอย่าง: https://jsfiddle.net/j5g2p0dc/5/

อัปเดต: ลิงก์ตัวอย่างหายไปดังนั้นฉันจึงสร้างใหม่


Uncaught TypeError: dt.addSeconds ไม่ใช่ฟังก์ชั่น
Ikrom

@Ikrom ตรวจสอบตัวอย่างผมสร้างขึ้นมาใหม่ใน jsfiddle ตั้งแต่คนเก่ากลับข้อผิดพลาด 404
kpull1

ดูเหมือนว่าฉันไม่ปล่อยให้คุณได้ใช้วิธีการที่กำหนดเองบนวัตถุเช่นวันaddSeconds Date.prototype.addSeconds = function(seconds){...}ใช่ใช้งานได้ขอบคุณสำหรับการอัปเดต
Ikrom

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

หลังจากดูคำตอบทั้งหมดและไม่ได้มีความสุขกับพวกเขาส่วนใหญ่นี่คือสิ่งที่ฉันมาด้วย ฉันรู้ว่าฉันมาสายเกินไปที่จะสนทนา แต่ที่นี่มันก็อยู่แล้ว

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 Object เป็นสตริงเวลาและลบสิ่งเพิ่มเติมโดยแยกสตริงและส่งคืนเฉพาะส่วนที่ต้องการ

ฉันคิดว่าฉันจะแบ่งปันวิธีนี้เนื่องจากไม่จำเป็นต้องใช้ regex ตรรกะและการแสดงกายกรรมทางคณิตศาสตร์เพื่อให้ได้ผลลัพธ์ในรูปแบบ "HH: mm: ss" และแทนที่จะใช้วิธีการที่สร้างขึ้นในตัว

คุณอาจต้องการดูเอกสารที่นี่: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date


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

ในหนึ่งบรรทัดโดยใช้โซลูชันของ TJ 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
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

สำหรับทุกคนที่ใช้ AngularJS ทางออกที่ง่ายคือการกรองค่าด้วยdate dateซึ่งแปลงมิลลิวินาทีเป็นสตริงตามรูปแบบที่ร้องขอ ตัวอย่าง:

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

โปรดทราบว่าสิ่งนี้คาดว่าจะมีหน่วยเป็นมิลลิวินาทีดังนั้นคุณอาจต้องการทวีคูณ timeRemaining ถึง 1,000 หากคุณแปลงจากวินาที (ตามคำถามดั้งเดิมได้รับการกำหนด)


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

ตัวอย่างการใช้งาน

alert("186".toHHMMSS());

1

ไม่มีคำตอบที่นี่ตรงตามความต้องการของฉันในขณะที่ฉันต้องการที่จะสามารถจัดการ

  1. จำนวนวินาที (วัน) และ
  2. ตัวเลขติดลบ

แม้ว่า OP ไม่จำเป็นสำหรับ 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)ผลตอบแทน6.00:05:51ในขณะที่ฉันคิดว่ามันควรจะกลับมา00:02:29:51
user1063287

0

ฉันใช้รหัสนี้ก่อนที่จะสร้างวัตถุช่วงเวลาอย่างง่าย:

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
ผลลัพธ์การวนซ้ำเป็นเทคนิคการเขียนโค้ดที่แย่มากและไม่ควรใช้มันจะทำให้หมูมีพลังในการประมวลผลของคุณและทำให้เว็บไซต์มีความ
ล่าช้า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.