Javascript วินาทีเป็นนาทีและวินาที


170

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

var mind = time % (60 * 60);
var minutes = Math.floor(mind / 60);

var secd = mind % 60;
var seconds = Math.ceil(secd);

อย่างไรก็ตามเมื่อฉันไปถึง 1 ชั่วโมงหรือ 3600 วินาทีมันจะคืนค่า 0 นาทีและ 0 วินาที ฉันจะหลีกเลี่ยงสิ่งนี้ได้อย่างไรเพื่อให้ส่งกลับทุกนาที

ขอบคุณ


เพราะเมื่อเวลา = 3600, 3600% 3600 จะเป็น 0 เสมอ ... ดังนั้นทุกอย่างจะเป็น 0 ตามการคำนวณของคุณ
MSI

คำตอบ:


338

ในการรับจำนวนนาทีเต็มให้แบ่งจำนวนวินาทีทั้งหมดด้วย 60 (60 วินาที / นาที):

var minutes = Math.floor(time / 60);

และเพื่อให้ได้จำนวนวินาทีที่เหลือให้คูณนาทีเต็มด้วย 60 และลบออกจากวินาทีทั้งหมด:

var seconds = time - minutes * 60;

ตอนนี้ถ้าคุณต้องการรับชั่วโมงเต็มด้วยให้หารจำนวนวินาทีทั้งหมดด้วย 3600 (60 นาที / ชั่วโมง· 60 วินาที / นาที) ก่อนจากนั้นคำนวณวินาทีที่เหลือ:

var hours = Math.floor(time / 3600);
time = time - hours * 3600;

จากนั้นคุณคำนวณนาทีเต็มและวินาทีที่เหลืออยู่

โบนัส:

ใช้รหัสต่อไปนี้เพื่อพิมพ์เวลา (แนะนำโดย Dru)

function str_pad_left(string,pad,length) {
    return (new Array(length+1).join(pad)+string).slice(-length);
}

var finalTime = str_pad_left(minutes,'0',2)+':'+str_pad_left(seconds,'0',2);

57
การทำความสะอาดวินาทีที่เหลืออยู่ทำได้ยากขึ้นโดยทำ 'var seconds = time% 60'
Edward D'Souza

11
@Radio เพิ่มเลขศูนย์นำหน้าโดยใช้ function str_pad_left(string,pad,length){ return (new Array(length+1).join(pad)+string).slice(-length); } var finalTime = str_pad_left(minutes,'0',2)+':'+str_pad_left(seconds,'0',2);
Dru

1
timeการแก้ปัญหานี้จะไม่ทำงานสำหรับค่าลบของ หากคุณป้อนอินสแตนซ์ -1 วินาทีคุณจะได้รับ -1 นาทีและ 59 วินาทีย้อนกลับ ...
Pylinux

5
ความรู้สึกเชิงลบtimeคืออะไร? ความแตกต่างของเวลาจะเป็นบวกเสมอ
mcont

4
คุณสามารถใช้โมดูลัสเพื่อรับจำนวนวินาทีมันอ่านได้มากขึ้นในความคิดของฉัน var seconds = time % 60
JCM

106

โซลูชันแฟนซีอื่น ๆ :

function fancyTimeFormat(duration)
{   
    // Hours, minutes and seconds
    var hrs = ~~(duration / 3600);
    var mins = ~~((duration % 3600) / 60);
    var secs = ~~duration % 60;

    // Output like "1:01" or "4:03:59" or "123:03:59"
    var ret = "";

    if (hrs > 0) {
        ret += "" + hrs + ":" + (mins < 10 ? "0" : "");
    }

    ret += "" + mins + ":" + (secs < 10 ? "0" : "");
    ret += "" + secs;
    return ret;
}

~~เป็นชวเลขสำหรับMath.floorดูลิงค์นี้สำหรับข้อมูลเพิ่มเติม

ลองออนไลน์


14
ความหมายของ~~อะไร
mcont

9
มันเป็นมือที่มีพื้นฐานสำหรับMath.floorดูลิงค์นี้
ตัวผู้

มันใช้ได้ดี ..... :) คุณสามารถปัดเศษของค่าเช่นนี้ hrs = hrs.toFixed (0); mins = mins.toFixed (0); secs = secs.toFixed (0);
Abdul Khaliq

1
ขอบคุณสำหรับโซลูชันนี้! ฉันเพิ่มtime = math.round(time)ไปที่บรรทัดแรกเพื่อให้ฉันปัดเศษวินาที
fotoflo

นี่คือทางออกที่ถูกต้องมากขึ้น ตามที่ระบุไว้ข้างต้นการแก้ปัญหาด้วยคะแนนโหวตมากที่สุดในหน้านี้แสดง 180 วินาทีเป็น 2m60s
SongBox

71

สำหรับคนที่ลดลงในความหวังว่าการที่ง่ายรวดเร็วและวิธีการแก้ปัญหาในระยะสั้นจึงวินาทีรูปแบบออกเป็นM:SS:

function fmtMSS(s){return(s-(s%=60))/60+(9<s?':':':0')+s}

ทำ ..
ฟังก์ชั่นที่ยอมรับทั้งNumber (แนะนำ) หรือString (2 แปลง 'ลงโทษ' ซึ่งคุณสามารถลดลงครึ่งหนึ่งโดย prepending +ในการโต้เถียงการเรียกฟังก์ชั่นสำหรับsเช่น: fmtMSS(+strSeconds)) คิดเป็นวินาทีจำนวนเต็มบวกsเป็นอาร์กิวเมนต์

ตัวอย่าง:

fmtMSS(    0 );  //   0:00
fmtMSS(   '8');  //   0:08
fmtMSS(    9 );  //   0:09
fmtMSS(  '10');  //   0:10
fmtMSS(   59 );  //   0:59
fmtMSS( +'60');  //   1:00
fmtMSS(   69 );  //   1:09
fmtMSS( 3599 );  //  59:59
fmtMSS('3600');  //  60:00
fmtMSS('3661');  //  61:01
fmtMSS( 7425 );  // 123:45

ทำให้พังถล่ม:

function fmtMSS(s){   // accepts seconds as Number or String. Returns m:ss
  return( s -         // take value s and subtract (will try to convert String to Number)
          ( s %= 60 ) // the new value of s, now holding the remainder of s divided by 60 
                      // (will also try to convert String to Number)
        ) / 60 + (    // and divide the resulting Number by 60 
                      // (can never result in a fractional value = no need for rounding)
                      // to which we concatenate a String (converts the Number to String)
                      // who's reference is chosen by the conditional operator:
          9 < s       // if    seconds is larger than 9
          ? ':'       // then  we don't need to prepend a zero
          : ':0'      // else  we do need to prepend a zero
        ) + s ;       // and we add Number s to the string (converting it to String as well)
}

หมายเหตุ: สามารถเพิ่มช่วงลบได้โดยเพิ่ม(0>s?(s=-s,'-'):'')+การส่งคืนนิพจน์ (จริง ๆ แล้ว(0>s?(s=-s,'-'):0)+ก็ใช้ได้เช่นกัน)


ฉันขอแนะนำให้เพิ่มMath.floor(s)บรรทัดสุดท้ายเพื่อผลลัพธ์ที่สะอาดยิ่งขึ้น ทำงานได้ดีมากขอบคุณ!
Diego Fortes

@PossessWithin: ไม่คุณไม่ควร"เพิ่ม Math.floor (s) ลงในบรรทัดสุดท้าย" (ของข้อมูลย่อย - snippet) ด้วยเหตุผลหลายประการที่สำคัญที่สุดเพราะจะเป็นการแนะนำบั๊กสำหรับค่าระหว่าง9และ10ไม่มีการแก้ไขเพิ่มเติม; ถ้าคุณป้อนสำหรับตัวอย่าง69.25แล้วออกจะเป็น1:9แทน1:09! ฟังก์ชั่นนี้ (ซึ่งฉันระบุจำนวนเต็มอย่างชัดเจนเป็นวินาที) มีจุดประสงค์และสร้างขึ้นด้วยความรักเป็นเครื่องมือที่มีการบีบอัดสูง / 'เอ็นจิ้น' (ไม่ใช่แบบนินจาสำหรับขนาด) และดังนั้นฉันคิดว่ามันเป็นเรื่องยาก / cleanup / filter ...
GitaarLAB

... งาน (เช่นNaN, +/-Infinityฯลฯ ) และการปัดเศษตัวเลือกที่ควรจะทำโดยโปรแกรมเมอร์ก่อนที่จะมีการเรียกฟังก์ชั่นที่อยู่บนพื้นฐานความต้องการที่เฉพาะเจาะจงและเป็นไปได้ที่การป้อนค่าที่โปรแกรมประยุกต์ที่สามารถพบ! โดยปกติคุณจะสามารถแก้ไขได้หากความรู้เกี่ยวกับโดเมนของคุณเกี่ยวกับค่าอินพุทที่คาดการณ์บอกว่ากรณีการใช้งานเฉพาะของคุณมักจะได้รับค่าทศนิยมและการทดสอบแบบสมบูรณ์แสดงว่าแอปพลิเคชันของคุณ ในกรณีของคุณที่คุณต้องการแก้ไขเฉพาะค่าบวกคุณต้อง ....
GitaarLAB

... แก้ไข(9<s?':':':0')เป็น(10>s?':0':':')(เพิ่ม 1 อักขระ แต่ 'เสียสละ' 5 จาก 6 เส้นทางจริงไปยังเส้นทางเท็จ) หรือ(10<=s?':':':0')(เพิ่ม 2 ตัวอักษร แต่รักษา 5 จาก 6 เส้นทางจริง) จากนั้นผมแนะนำให้มีการเปลี่ยนแปลงที่ต่อท้ายสุดท้าย+sที่จะ+(s|0) แทนการ Math.floor(s)เป็นไปไม่ทำลายความงามของไม่จำเป็นต้องแก้ปัญหาและการโทรMath.floor ในขณะที่ยังคงทำงานได้อย่างถูกต้องมากกว่าทั้ง 53bit +/-MAX_SAFE_INTEGERช่วงแทน 'เพียง' 32bit (ไม่ได้ลงนาม) หรือ 31bit (ลงนาม) ช่วง! โปรดทราบว่าABS(s)สนามแม่เหล็กนั้นรับประกันว่าจะเล็กกว่า 60 ดังนั้นสัญญาณที่ลงนาม ...
GitaarLAB

... เซ็นชื่อบิตหรือ OR ปลอดภัย นอกจากนี้โปรดทราบว่าการปรับเปลี่ยนเฉพาะนี้โดยไม่เพิ่มจำนวนวินาทีที่เหลือจะทำให้ฟังก์ชันเศษส่วนของเอาต์พุตเศษส่วนโดยไม่มีเลขศูนย์แบบเศษส่วนแต่มักจะมีตัวเลขหลักสำคัญไม่มากกว่าศูนย์ 3 หลักซึ่งคุณอาจต้องจัดการเช่นกัน สุดท้ายเมื่อรวมกับรหัสการแก้ไขล่วงหน้าที่เป็นทางเลือกสำหรับช่วงลบการปรับเปลี่ยนนี้โดยเฉพาะจะมีผลต่อTRUNCateวินาที (ไม่ใช่การปูพื้น ) PS: PFFT, whoever came up with just 512 char limit for any meaningful comment should be...
GitaarLAB

21

คุณยังสามารถใช้วัตถุวันที่ดั้งเดิม:

var date = new Date(null);
date.setSeconds(timeInSeconds);

// retrieve time ignoring the browser timezone - returns hh:mm:ss
var utc = date.toUTCString();
// negative start index in substr does not work in IE 8 and earlier
var time = utc.substr(utc.indexOf(':') - 2, 8)

// retrieve each value individually - returns h:m:s
var time = date.getUTCHours() + ':' + date.getUTCMinutes() + ':' +  date.getUTCSeconds();

// does not work in IE8 and below - returns hh:mm:ss
var time = date.toISOString().substr(11, 8);

// not recommended - only if seconds number includes timezone difference
var time = date.toTimeString().substr(0, 8);

แน่นอนว่าวิธีนี้ใช้งานได้เฉพาะเวลาไม่เกิน 24 ชั่วโมง;)


1
ไม่เคยคิดที่จะปล่อยให้วัตถุ Date จัดการกับการจัดรูปแบบ มีความยืดหยุ่นน้อยลง แต่ถ้าคุณต้องการ HH: mm: ss (หรือส่วนย่อยของที่) นี้เป็นที่ดี
MartinAnsty

ฉันลองมันด้วย 25 วินาทีแล้วก็คืน 01:00:25 ซึ่งเท่ากับ 1 ชั่วโมง 25 วินาที
timstermatic

ใช่อาจเป็นเพราะเขตเวลาของคุณ ฉันได้อัปเดตโซลูชันเพื่อจัดการกับกรณีนี้แล้ว
hamczu

dateสามารถสร้างเป็นvar date = new Date(timeInSeconds * 1000)
Nuno André

20

2019 ตัวแปรที่ดีที่สุด

รูปแบบ hh:mm:ss

console.log(display(60 * 60 * 2.5 + 25)) // 2.5 hours + 25 seconds

function display (seconds) {
  const format = val => `0${Math.floor(val)}`.slice(-2)
  const hours = seconds / 3600
  const minutes = (seconds % 3600) / 60

  return [hours, minutes, seconds % 60].map(format).join(':')
}


อืมsecondsคือ const คุณไม่สามารถมอบหมายใหม่ได้
ronapelbaum

@ronapelbaum การโต้แย้งนี้ไม่คงที่ฉันไม่เข้าใจสิ่งที่คุณหมายถึง
ИльяЗеленько

@ronapelbaum ถ้าคุณกำหนดวินาทีแทนที่จะให้มันเป็นพารามิเตอร์ที่คุณต้องใช้letเช่น function display (state) { let seconds = state.seconds; ... }นั่นเป็นข้อผิดพลาดที่มาจากไหน?
retrovertigo

ฟังก์ชั่นพารามิเตอร์ควรได้รับการปฏิบัติเหมือนเป็น const เมื่อคุณใช้%=คุณจะกำหนดพารามิเตอร์นี้อีกครั้ง เพียงใช้seconds%60
ronapelbaum

16
function secondsToMinutes(time){
    return Math.floor(time / 60)+':'+Math.floor(time % 60);
}

3
สิ่งนี้สามารถปรับปรุงได้ด้วยศูนย์ padding วินาที: function secondsToMinutes(time){ return Math.floor(0 / 60)+':'+('0'+Math.floor(0 % 60)).slice(-2); }
Kus

ดี! ขอบคุณ @Kus เพียงคุณอาจต้องการแทนที่ทั้งสองนั้น0ด้วยtimeฉันถูกต้องหรือไม่
mikey

2
@ Mikey โอ๊ะโอ! ใช่function secondsToMinutes(time){ return Math.floor(time / 60) + ':' + ('0' + Math.floor(time % 60)).slice(-2) }
Kus

12

หากต้องการเพิ่มศูนย์นำหน้าฉันจะทำ:

var minutes = "0" + Math.floor(time / 60);
var seconds = "0" + (time - minutes * 60);
return minutes.substr(-2) + ":" + seconds.substr(-2);

ดีและสั้น



6

สายการบินเดียว (ไม่ทำงานกับชั่วโมง):

 function sectostr(time) {
    return ~~(time / 60) + ":" + (time % 60 < 10 ? "0" : "") + time % 60;
 }

4

วินาทีถึง h: mm: ss

var hours = Math.floor(time / 3600);
time -= hours * 3600;

var minutes = Math.floor(time / 60);
time -= minutes * 60;

var seconds = parseInt(time % 60, 10);

console.log(hours + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds < 10 ? '0' + seconds : seconds));

บางคนสามารถอธิบายminutes < 10 ? '0' + minutes : minutesให้ฉันได้โดยสมมติความรู้พื้นฐาน js เท่านั้น?
Zediiiii

หากนาทีเป็นตัวเลขหลักเดียว (<10) จะเติมศูนย์นำหน้าด้วยไม่ใช่
kayz1

นั่นช่วยได้! ฉันไม่รู้ว่า "?" เป็นผู้ประกอบการที่สามใน js
Zediiiii

4

ฟังก์ชั่นต่อไปนี้จะช่วยให้คุณได้รับวันชั่วโมงนาทีวินาที

toDDHHMMSS(inputSeconds){
        const Days = Math.floor( inputSeconds / (60 * 60 * 24) );
        const Hour = Math.floor((inputSeconds % (60 * 60 * 24)) / (60 * 60));
        const Minutes = Math.floor(((inputSeconds % (60 * 60 * 24)) % (60 * 60)) / 60 );
        const Seconds = Math.floor(((inputSeconds % (60 * 60 * 24)) % (60 * 60)) % 60 );
        let ddhhmmss  = '';
        if (Days > 0){
            ddhhmmss += Days + ' Day ';
        }
        if (Hour > 0){
            ddhhmmss += Hour + ' Hour ';
        }

        if (Minutes > 0){
            ddhhmmss += Minutes + ' Minutes ';
        }

        if (Seconds > 0){
            ddhhmmss += Seconds + ' Seconds ';
        }
        return ddhhmmss;
    }
alert( toDDHHMMSS(2000));

ฉันชอบอันนี้ ผมเปลี่ยนif (Days > 0){ ddhhmmss += Days + ' Day '; }ไปif (Days > 0) {ddhhmmss += Days === 1 ? Days + ' Day ' : Days + ' Days '};ที่จะพูด1 Day, 2 Days, 3 Daysฯลฯ ที่คล้ายกันสามารถทำได้สำหรับคนอื่น ๆ
ผลิต

4

หลังจากทั้งหมดนี้อีกวิธีง่ายๆ:

const time = new Date(null);
time.setSeconds(7530);
console.log(time.getHours(), time.getMinutes(), time.getSeconds());

1
โดยใช้time.setSeconds(1);ผลตอบแทนเมื่อมันควรจะเป็น1 0 1 0 0 1
ผลิต

3

อีกหนึ่งโซลูชั่นที่สง่างามกว่านี้คือ:

/**
 * Convert number secs to display time
 *
 * 65 input becomes 01:05.
 *
 * @param Number inputSeconds Seconds input.
 */
export const toMMSS = inputSeconds => {
    const secs = parseInt( inputSeconds, 10 );
    let minutes = Math.floor( secs / 60 );
    let seconds = secs - minutes * 60;

    if ( 10 > minutes ) {
        minutes = '0' + minutes;
    }
    if ( 10 > seconds ) {
        seconds = '0' + seconds;
    }

    // Return display.
    return minutes + ':' + seconds;
};

2

สำหรับการเพิ่มศูนย์ฉันไม่เห็นความจำเป็นที่จะต้องมีฟังก์ชั่นอื่นที่คุณสามารถใช้เป็นตัวอย่างได้

var mins=Math.floor(StrTime/60);
var secs=StrTime-mins * 60;
var hrs=Math.floor(StrTime / 3600);
RoundTime.innerHTML=(hrs>9?hrs:"0"+hrs) + ":" + (mins>9?mins:"0"+mins) + ":" + (secs>9?secs:"0"+secs);

ทำไมเราถึงมีข้อความที่มีเงื่อนไขในตอนแรก

(เงื่อนไขหรือไม่ถ้าเป็นจริง: ถ้าเป็นเท็จ) ดังนั้นถ้าตัวอย่างวินาทีมีค่ามากกว่า 9 แสดงเพียงแค่วินาทีจะเพิ่มสตริง 0 ก่อนหน้า


2

ลองสิ่งนี้: การแปลงวินาทีเป็นชั่วโมง, MIN และ SEC

function convertTime(sec) {
    var hours = Math.floor(sec/3600);
    (hours >= 1) ? sec = sec - (hours*3600) : hours = '00';
    var min = Math.floor(sec/60);
    (min >= 1) ? sec = sec - (min*60) : min = '00';
    (sec < 1) ? sec='00' : void 0;

    (min.toString().length == 1) ? min = '0'+min : void 0;    
    (sec.toString().length == 1) ? sec = '0'+sec : void 0;    

    return hours+':'+min+':'+sec;
}

2

var seconds = 60;
var measuredTime = new Date(null);
measuredTime.setSeconds(seconds); // specify value of SECONDS
var Time = measuredTime.toISOString().substr(11, 8);
document.getElementById("id1").value = Time;
<div class="form-group">
  <label for="course" class="col-md-4">Time</label>
  <div class="col-md-8">
    <input type="text" class="form-control" id="id1" name="field">Min
  </div>
</div>


2

หากคุณกำลังใช้Moment.jsคุณสามารถใช้Durationวัตถุในตัวได้

const duration = moment.duration(4825, 'seconds');

const h = duration.hours(); // 1
const m = duration.minutes(); // 20
const s = duration.seconds(); // 25

2

2563 ปรับปรุง

การใช้คณิตศาสตร์พื้นฐานและจาวาสคริปต์ง่าย ๆ สามารถทำได้ในโค้ดเพียงไม่กี่บรรทัด

ตัวอย่าง - การแปลงไป7735 secondsHH:MM:SS


คณิตศาสตร์:

การคำนวณใช้:

  1. Math.floor()- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor

Math.floor()ฟังก์ชันส่งกลับเลขที่ใหญ่ที่สุดน้อยกว่าหรือเท่ากับจำนวนที่กำหนด

  1. %ตัวดำเนินการทางคณิตศาสตร์ (ส่วนที่เหลือ) - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder

ตัวดำเนินการส่วนที่เหลือส่งคืนส่วนที่เหลือที่เหลืออยู่เมื่อหนึ่งตัวถูกดำเนินการถูกหารด้วยตัวถูกดำเนินการที่สอง มันมักจะใช้สัญลักษณ์ของการจ่ายเงินปันผล

ตรวจสอบรหัสด้านล่าง วินาทีจะถูกหารด้วย3600เพื่อรับจำนวนชั่วโมงและส่วนที่เหลือซึ่งใช้ในการคำนวณจำนวนนาทีและวินาที

HOURS => 7735 / 3600 = 2 remainder 535

MINUTES => 535 / 60 = 8 remainder 55

SECONDS => 55


ZEROS ชั้นนำ:

คำตอบมากมายที่นี่ใช้วิธีการที่ซับซ้อนไปยังหมายเลขที่แสดงชั่วโมงนาทีและวินาทีในทางที่เหมาะสมกับชั้นนำศูนย์ - 45, 04ฯลฯ padStart()ซึ่งสามารถทำได้โดยใช้ toString()งานนี้สำหรับสตริงดังนั้นจำนวนจะต้องถูกแปลงเป็นสตริงใช้

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart

padStart()วิธีแผ่นสตริงปัจจุบันด้วยเชือกอีก (หลาย ๆ ครั้งถ้าจำเป็น) จนกระทั่งสตริงส่งผลถึงระยะเวลาที่กำหนด การเติมจะใช้จากจุดเริ่มต้นของสตริงปัจจุบัน


รหัส:

function secondsToTime(e){
    var h = Math.floor(e / 3600).toString().padStart(2,'0'),
        m = Math.floor(e % 3600 / 60).toString().padStart(2,'0'),
        s = Math.floor(e % 60).toString().padStart(2,'0');
    
    return h + ':' + m + ':' + s;
}

console.log(secondsToTime(7735));  //02:08:55

/*
secondsToTime(SECONDS) => HH:MM:SS 

secondsToTime(8)       => 00:00:08 
secondsToTime(68)      => 00:01:08
secondsToTime(1768)    => 00:29:28
secondsToTime(3600)    => 01:00:00
secondsToTime(5296)    => 01:28:16
secondsToTime(7735)    => 02:08:55
secondsToTime(45296)   => 12:34:56
secondsToTime(145296)  => 40:21:36
secondsToTime(1145296) => 318:08:16
*/


1

คุณได้ทำรหัสเพียงพอที่จะติดตามส่วนนาทีและวินาที

สิ่งที่คุณสามารถทำได้คือการเพิ่มปัจจัยชั่วโมงใน:

var hrd = time % (60 * 60 * 60);
var hours = Math.floor(hrd / 60);

var mind = hrd % 60;
var minutes = Math.floor(mind / 60);

var secd = mind % 60;
var seconds = Math.ceil(secd);

var moreminutes = minutes + hours * 60

นี่จะให้สิ่งที่คุณต้องการด้วย


ฉันลองใช้ "เวลา" เป็นวินาทีและมันก็ไม่ทำงาน ตัวอย่างเช่น 975 วินาทีหมายถึง hrd = 975 ซึ่งหมายถึงชั่วโมงคือ 16
Spedge

1

ฉันคิดถึงวิธีที่เร็วกว่าในการทำสิ่งนี้และนี่คือสิ่งที่ฉันคิดไว้

var sec = parseInt(time);
var min=0;
while(sec>59){ sec-=60; min++;}

ถ้าเราต้องการแปลง "เวลา" เป็นนาทีและวินาทีตัวอย่างเช่น:

// time = 75,3 sec
var sec = parseInt(time); //sec = 75
var min=0;
while(sec>59){ sec-=60; min++;} //sec = 15; min = 1

1

ใส่สองเซ็นต์ของฉันใน:

function convertSecondsToMinutesAndSeconds(seconds){
            var minutes;
            var seconds;
            minutes = Math.floor(seconds/60);
            seconds = seconds%60;

            return [minutes, seconds];
        }

ดังนั้นนี่:

var minutesAndSeconds = convertSecondsToMinutesAndSeconds(101);

จะมีผลลัพธ์ต่อไปนี้:

[1,41];

จากนั้นคุณสามารถพิมพ์ได้เช่น:

console.log('TIME : ' +  minutesSeconds[0] + ' minutes, ' + minutesSeconds[1] + ' seconds');

//TIME : 1 minutes, 41 seconds

1

strftime.js ( github strftime ) เป็นหนึ่งในห้องสมุดรูปแบบเวลาที่ดีที่สุด มันเบามาก - 30KB - และมีประสิทธิภาพ การใช้มันช่วยให้คุณสามารถแปลงวินาทีเป็นเวลาได้อย่างง่ายดายในหนึ่งบรรทัดของโค้ดโดยส่วนใหญ่อาศัยคลาสเนทีฟดั้งเดิม

เมื่อสร้าง Date ใหม่อาร์กิวเมนต์ที่เป็นทางเลือกแต่ละรายการจะเป็นตำแหน่งดังนี้

new Date(year, month, day, hours, minutes, seconds, milliseconds);

ดังนั้นหากคุณเริ่มต้นวันที่ใหม่โดยมีอาร์กิวเมนต์ทั้งหมดเป็นศูนย์จนถึงไม่กี่วินาทีคุณจะได้รับ:

var seconds = 150;
var date = new Date(0,0,0,0,0,seconds);
=> Sun Dec 31 1899 00:02:30 GMT-0500 (EST)

คุณจะเห็นว่า 150 วินาทีคือ 2 นาทีและ 30 วินาทีตามที่เห็นในวันที่สร้าง จากนั้นใช้รูปแบบ strftime ("% M:% S" สำหรับ "MM: SS") มันจะเอาท์พุทสตริงนาทีของคุณ

var mm_ss_str = strftime("%M:%S", date);
=> "02:30"

ในหนึ่งบรรทัดดูเหมือนว่า:

var mm_ss_str = strftime('%M:%S', new Date(0,0,0,0,0,seconds));
=> "02:30"

นอกจากนี้ยังช่วยให้คุณสามารถเปลี่ยนการรองรับ HH: MM: SS และ MM: SS ได้ตามจำนวนวินาที ตัวอย่างเช่น:

# Less than an Hour (seconds < 3600)
var seconds = 2435;
strftime((seconds >= 3600 ? '%H:%M:%S' : '%M:%S'), new Date(0,0,0,0,0,seconds));
=> "40:35"

# More than an Hour (seconds >= 3600)
var seconds = 10050;
strftime((seconds >= 3600 ? '%H:%M:%S' : '%M:%S'), new Date(0,0,0,0,0,seconds));
=> "02:47:30"

และแน่นอนคุณสามารถผ่านรูปแบบใดก็ได้ที่คุณต้องการใช้เวลาห้านาทีหากคุณต้องการให้เวลาในสตริงมีความหมายมากขึ้นหรือน้อยลง

var format = 'Honey, you said you\'d be read in %S seconds %M minutes ago!';
strftime(format, new Date(0,0,0,0,0,1210));
=> "Honey, you said you'd be read in 10 seconds 20 minutes ago!"

หวังว่านี่จะช่วยได้


1
export function TrainingTime(props) {
    const {train_time } = props;
    const hours = Math.floor(train_time/3600);
    const minutes = Math.floor((train_time-hours * 3600) / 60);
    const seconds = Math.floor((train_time%60));

    return `${hours} hrs  ${minutes} min  ${seconds} sec`;
}

2
ยินดีต้อนรับสู่ Stack Overflow ตามที่แนะนำโดย @PhilRoggenbuck คำอธิบายจะช่วยได้ สำหรับข้อมูลเพิ่มเติมอ่านstackoverflow.com/help/how-to-answer
Mikkel

0

ฉันขอแนะนำวิธีแก้ไขปัญหาอื่น:

function formatTime(nbSeconds, hasHours) {
    var time = [],
        s = 1;
    var calc = nbSeconds;

    if (hasHours) {
        s = 3600;
        calc = calc / s;
        time.push(format(Math.floor(calc)));//hour
    }

    calc = ((calc - (time[time.length-1] || 0)) * s) / 60;
    time.push(format(Math.floor(calc)));//minute

    calc = (calc - (time[time.length-1])) * 60;
    time.push(format(Math.round(calc)));//second


    function format(n) {//it makes "0X"/"00"/"XX"
        return (("" + n) / 10).toFixed(1).replace(".", "");
    }

    //if (!hasHours) time.shift();//you can set only "min: sec"

    return time.join(":");
};
console.log(formatTime(3500));//58:20
console.log(formatTime(305));//05:05
console.log(formatTime(75609, true));//21:00:09
console.log(formatTime(0, true));//00:00:00


0

ฉันรู้ว่ามันได้รับการแก้ไขในหลาย ๆ ฉันต้องการฟังก์ชั่นนี้สำหรับสคริปต์ After Effects ที่ความเร็วหรือเนมสเปซไม่เป็นปัญหา ฉันวางมันไว้ที่นี่เพื่อคนที่ต้องการบางอย่างที่คล้ายกัน ฉันยังเขียนการทดสอบและทำงานได้ดี ดังนั้นนี่คือรหัส:

Number.prototype.asTime = function () {
    var hour = Math.floor(this / 3600),
        min = Math.floor((this - hour * 3600) / 60),
        sec = this - hour * 3600 - min * 60,
        hourStr, minStr, secStr;
    if(hour){
        hourStr = hour.toString(),
        minStr = min < 9 ? "0" + min.toString() : min.toString();
        secStr = sec < 9 ? "0" + sec.toString() : sec.toString();
        return hourStr + ":" + minStr + ":" + secStr + "hrs";
    }
    if(min){
        minStr = min.toString();
        secStr = sec < 9 ? "0" + sec.toString() : sec.toString();
        return  minStr + ":" + secStr + "min";
    }
    return sec.toString() + "sec";
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.