แปลง HH: MM: SS string เป็นวินาทีเฉพาะใน javascript


99

ฉันมีข้อกำหนดที่คล้ายกันดังนี้: แปลงเวลาในรูปแบบ HH: MM: SS เป็นวินาทีเท่านั้นหรือไม่

แต่ในจาวาสคริปต์ ฉันได้เห็นตัวอย่างมากมายของการแปลงวินาทีเป็นรูปแบบต่างๆ แต่ไม่ใช่ HH: MM: SS เป็นวินาที ความช่วยเหลือใด ๆ จะได้รับการชื่นชม


โอ๊ะ .. ขอโทษที่พิมพ์ผิด ใช่เวลา hh: mm: ss
Sri Reddy

คืออะไรDDในHH:MM:DD?
Brian Driscoll

2
มันเป็นอัลกอริทึมเดียวกับคำถาม PHP นั้น
scottheckel

อืม .. H (ชั่วโมง) == 3600 วินาที, M (นาที) == 60 วินาที ... ดังนั้น ..
MilkyWayJoe

1
ทางออกเดียวที่ฉันคิดคือแยกสตริงในอาร์เรย์แล้วคูณ 3600 เป็นชั่วโมงแล้วคูณ 60 เป็นนาทีและบวกทั้งหมดด้วยส่วนวินาที นี่เป็นวิธีแก้ปัญหาที่ง่ายที่สุดหรือไม่?
Sri Reddy

คำตอบ:


194

ลองสิ่งนี้:

var hms = '02:04:33';   // your input string
var a = hms.split(':'); // split it at the colons

// minutes are worth 60 seconds. Hours are worth 60 minutes.
var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); 

console.log(seconds);

3
นี่คือรุ่นต้นแบบของสิ่งนี้! String.prototype.toSeconds = function () { if (!this) return null; var hms = this.split(':'); return (+hms[0]) * 60 * 60 + (+hms[1]) * 60 + (+hms[2] || 0); } หมายเหตุ: || 0ในตอนท้ายเหมาะสำหรับการใช้งานโค้ดนี้ - ป้องกันปัญหาเกี่ยวกับการแสดงเวลา (ยังใช้ได้) ของ HH: MM (อินพุตประเภท Chrome = "เวลา" จะแสดงผลในรูปแบบนี้เมื่อวินาที = 0)
Fateh Khalsa

สิ่งที่น่ากลัว
วน

ฉันhh:mmไม่ได้มีเพียงsecondsในกรณีนี้เท่านั้นที่ฉันต้องแก้ไข .. ?
Mr world wide

1
@AbdulWaheed Change this line: var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); tovar seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
Rova

4
การใช้โอเปอเรเตอร์ "+" เพื่อแปลงสตริงตัวเลขเป็นตัวเลขไม่ใช่ความคิดที่ดี มันสั้นและดู "ฉลาด" แต่มันสับสนและไม่สะอาด ใช้ parseInt (x, 10) แทน และหลีกเลี่ยงซับเดียว ป้องกันข้อผิดพลาดด้วยการป้อนข้อมูลที่ไม่ได้กำหนด ตัวอย่างเช่นไม่ใช่สตริงไม่มี ":" หรือเฉพาะ "HH: MM" ฯลฯ
Dominik

68

ฟังก์ชันนี้จัดการ "HH: MM: SS" เช่นเดียวกับ "MM: SS" หรือ "SS"

function hmsToSecondsOnly(str) {
    var p = str.split(':'),
        s = 0, m = 1;

    while (p.length > 0) {
        s += m * parseInt(p.pop(), 10);
        m *= 60;
    }

    return s;
}

ดีฉันจะเก็บไว้หากความต้องการเกิดขึ้นเมื่อเวลาผ่านไปเป็นรูปแบบใด ๆ ขอบคุณ!
Sri Reddy

คำตอบที่ดีที่สุดสำหรับฉันจนถึงตอนนี้
Rezwan Azfar Haleem

คำตอบนี้มีประโยชน์
Mike Aron

ฉันต้องเปลี่ยนอะไรบ้างในฟังก์ชันของคุณเพื่อใช้ในรูปแบบ 'HH: MM' เท่านั้น
noyruto88

39

สิ่งนี้สามารถทำได้ค่อนข้างยืดหยุ่นดังต่อไปนี้:

'01:02:03'.split(':').reduce((acc,time) => (60 * acc) + +time);

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

+timeถูกนำมาใช้ในการลงเวลาในการตัวเลข

โดยพื้นฐานแล้วจะทำ: (60 * ((60 * HHHH) + MM)) + SS

หากผ่านไปเพียงไม่กี่วินาทีผลลัพธ์จะเป็นสตริงดังนั้นเพื่อแก้ไขว่าเราสามารถส่งผลลัพธ์ทั้งหมดเป็น int:

+('03'.split(':').reduce((acc,time) => (60 * acc) + +time));

นั่นเป็นเรื่องที่ฉลาดจริงๆ .. คำถามคือมันเร็วแค่ไหนเมื่อเทียบกับการคำนวณ
ThatBrianDude

4
ใช่มันฉลาด แต่เป็นตัวอย่างที่ดีในการสร้างโค้ดที่ยากต่อการบำรุงรักษาเพื่อไม่ให้ได้ประโยชน์ในทางปฏิบัติ จะบันทึกอักขระ 4 ตัวเมื่อ minified เทียบกับเวอร์ชันย่อของคำตอบที่ยอมรับ เนื่องจากตอนนี้หน้าเว็บจำนวนมากมีขนาดเกิน 1MB การประหยัดจึงค่อนข้างน้อยกว่าไม่มีนัยสำคัญ
RobG

5
แม้ว่าคำตอบนี้จะไม่สามารถเข้าใจได้ แต่ก็สามารถจัดการทั้งสองอย่างได้อย่างสง่างามHH:MM:SSเช่นเดียวกับMM:SSในขณะที่คำตอบที่ยอมรับไม่ได้
ckeeney

1
อันนี้มีข้อผิดพลาดการแปลงประเภทหากมีการระบุเฉพาะส่วนวินาที คุณต้องเริ่มต้นบันทึกด้วย 0 อย่างชัดเจนเพื่อป้องกัน ทำงาน: '03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);ล้มเหลวเนื่องจากส่งคืนสตริงที่ไม่คาดคิด:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
Felix Gertz

@FelixGertz เห็นดีฉันจะแก้ไขในกรณีนั้น
พอล

13

เนื่องจากฟังก์ชันgetTimeของอ็อบเจกต์ Date ได้รับมิลลิวินาทีตั้งแต่ 1970/01/01 เราสามารถทำได้:

var time = '12:23:00';
var seconds = new Date('1970-01-01T' + time + 'Z').getTime() / 1000;

1
เพิ่งตระหนักว่าสิ่งนี้ใช้ไม่ได้กับเวลาออมแสง ต้องใช้วันจริง
Yablargo

1
@Yablargo ขอบคุณ เวอร์ชันก่อนหน้าใช้งานไม่ได้ดีกับเขตเวลาท้องถิ่นดังนั้นฉันจึงแก้ไขให้ใช้รูปแบบวันที่และเวลาวันที่ UTC iso 8601
boskop

13

แปลงhh:mm:ssสตริงเป็นวินาทีในหนึ่งบรรทัด นอกจากนี้ยังได้รับอนุญาตh:m:sและรูปแบบmm:ss, m:sฯลฯ

'08:45:20'.split(':').reverse().reduce((prev, curr, i) => prev + curr*Math.pow(60, i), 0)

4
กรุณาอธิบายคำตอบของคุณ
B001 ᛦ

แปลงhh:mm:ssสตริงเป็นวินาทีในหนึ่งบรรทัด นอกจากนี้ยังได้รับอนุญาตh:m:sและรูปแบบmm:ss, m:sฯลฯ
ซ่อนพอล

คำตอบที่ดี! แต่คุณสามารถข้ามreverse(): '00: 01: 11'.split (':') ลด ((val, entry, i) => val + entry * (3600 / Math.pow (60, i)), 0 ) === 71
CMR

@CMR aproach ที่น่าสนใจ แต่ในกรณีmm:ssนี้จะทำงานไม่ถูกต้อง
Paul Hide

Math.pow ช้ามากและสามารถหลีกเลี่ยงได้ดังที่แสดงในคำตอบอื่น ๆ ตามการลด
Alejadro Xalabarder

9

ลอง

time="12:12:12";
tt=time.split(":");
sec=tt[0]*3600+tt[1]*60+tt[2]*1;

5
อานั่น * 1 เป็นวิธีที่ชาญฉลาดในการไม่ทำการต่อสายอักขระ :)
Dagg Nabbit

5

วิธีการคงที่ของ Javascript Date.UTC()ทำเคล็ดลับ:

alert(getSeconds('00:22:17'));

function getSeconds(time)
{
    var ts = time.split(':');
    return Date.UTC(1970, 0, 1, ts[0], ts[1], ts[2]) / 1000;
}

4

ต่อไปนี้เป็นแบบฟอร์มที่อ่านได้ง่ายขึ้นสำหรับคำตอบเดิมที่ได้รับการอนุมัติ

const getSeconds = (hms: string) : number => {
  const [hours, minutes, seconds] = hms.split(':');
  return (+hours) * 60 * 60 + (+minutes) * 60 + (+seconds);
};

2
new Date(moment('23:04:33', "HH:mm")).getTime()

เอาต์พุต: 1499755980000 (เป็นมิลลิวินาที) (1499755980000/1000) (เป็นวินาที)

หมายเหตุ: ผลลัพธ์นี้คำนวณแตกต่างจาก 1970-01-01 12: 0: 0 ถึงตอนนี้และเราต้องใช้โมเมนต์ js


OP ขอวินาทีไม่ใช่มิลลิวินาที
user7294900

สวัสดีผู้ใช้ 7294900 ขอบคุณสำหรับความคิดเห็นของคุณฉันจะอัปเดตคำตอบของฉัน jst เราต้องการหารด้วย 1,000
ITsDEv

1

ฟังก์ชันนี้ใช้ได้กับ MM: SS เช่นกัน:

const convertTime = (hms) => {
        if (hms.length <3){
         return hms
        } else if (hms.length <6){
          const a = hms.split(':')
          return hms = (+a[0]) * 60 + (+a[1])
        } else {
          const a = hms.split(':')
          return hms = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2])
        }
      }


1

นำมาจากโซลูชันที่กำหนดโดย Paul https://stackoverflow.com/a/45292588/1191101แต่ใช้สัญกรณ์ฟังก์ชันเก่าดังนั้นจึงสามารถใช้ในเอ็นจิ้น js อื่น ๆ ได้ (เช่น java Rhino)

function strToSeconds (stime)
{
   return +(stime.split(':').reduce(function (acc,time) { return +(60 * acc) + +time }));
}

หรือเพียงแค่อ่านเพิ่มเติม

function strToSeconds (stime)
{
  var tt = stime.split(':').reverse ();
  return ((tt.length >= 3) ? (+tt[2]): 0)*60*60 + 
         ((tt.length >= 2) ? (+tt[1]): 0)*60 + 
         ((tt.length >= 1) ? (+tt[0]): 0);
}

0

function parsehhmmsst(arg) {
	var result = 0, arr = arg.split(':')
	if (arr[0] < 12) {
		result = arr[0] * 3600 // hours
	}
	result += arr[1] * 60 // minutes
	result += parseInt(arr[2]) // seconds
	if (arg.indexOf('P') > -1) {  // 8:00 PM > 8:00 AM
		result += 43200
	}
	return result
}
$('body').append(parsehhmmsst('12:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('1:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('2:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('3:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('4:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('5:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('6:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('7:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('8:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('9:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('10:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('11:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('12:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('1:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('2:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('3:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('4:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('5:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('6:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('7:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('8:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('9:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('10:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('11:00:00 PM') + '<br>')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


0

คุณสามารถทำสิ่งนี้แบบไดนามิก - ในกรณีที่คุณพบไม่เพียง: HH: mm: ss แต่ยังรวมถึง mm: ss หรือแม้แต่ ss เพียงอย่างเดียว

var str = '12:99:07';
var times = str.split(":");
times.reverse();
var x = times.length, y = 0, z;
for (var i = 0; i < x; i++) {
    z = times[i] * Math.pow(60, i);
    y += z;
}
console.log(y);

0

นี่เป็นวิธีแก้ปัญหาที่ชัดเจนและเข้าใจง่ายที่สุด:

function convertDurationtoSeconds(duration){
    const [hours, minutes, seconds] = duration.split(':');
    return Number(hours) * 60 * 60 + Number(minutes) * 60 + Number(seconds);
};

const input = '01:30:45';
const output = convertDurationtoSeconds(input);
console.log(`${input} is ${output} in seconds`);

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