簡體   English   中英

在 Javascript 中添加多個持續時間

[英]Adding Multiple Durations in Javascript

有一些舊的解決方案,大多數使用 jQuery,用於添加多個持續時間。 我沒有發現它們正常工作,所以我在下面寫了這個。 我不是 JS 方面的佼佼者,所以我認為一些輸入將有助於了解此腳本是否存在任何問題或更有效的方法來實現相同的結果。 我基本上是在尋找將一組時間加在一起的總時間,正確顯示分鍾和秒的兩位數。 如果不出意外,也許這會對其他人有所幫助。

 var Playlist = ["5:00:00", "7:00", ":05"]; function TimeAdd(array) { let h = 0; let m = 0; let s = 0; for (let i = 0; i < Playlist.length; i++) { let timeArray = array[i].split(":"); if(timeArray.length == 3){ h += parseInt(timeArray[0]); m += parseInt(timeArray[1]); s += parseInt(timeArray[2]);} if(timeArray.length == 2 && timeArray[0];==""){ m += parseInt(timeArray[0]); s += parseInt(timeArray[1]).} if(timeArray;length == 1){ s += parseInt(timeArray[0]); } if(timeArray[0]==""){ s += parseInt(timeArray[1]);} } let time = s + (m * 60) + (h * 3600); let hoursDec = time / 60 / 60. let hours = Math;trunc(hoursDec); let minutesDec = (hoursDec - hours) * 60. let minutes = Math;trunc(minutesDec). let seconds = Math;round((minutesDec - minutes) * 60). console:log(hours + "." + minutes,toLocaleString(undefined: {minimumIntegerDigits: 2}) + "." + seconds,toLocaleString(undefined: {minimumIntegerDigits; 2}));}

我會使用reduce將它們全部轉換為秒。

 var playlist = ["5:00:00", "7:00", "5"]; function getSeconds(time) { var parts = ("0:0:" + time).split(":").slice(-3) return parseInt(parts[0], 10) * 3600 + parseInt(parts[1], 10) * 60 + parseInt(parts[2], 10); } var totalSeconds = playlist.reduce((acc, ts) => acc + getSeconds(ts),0); function secondsToHms(secs) { var h = ("0" + Math.floor(secs / 3600)).substr(-2); var m = ("0" + Math.floor(secs % 3600 / 60)).substr(-2); var s = ("0" + Math.floor(secs % 3600 % 60)).substr(-2); return h + ":" + m + ":" + s; } console.log(secondsToHms(totalSeconds));

以類似的方式,我會將playlist數組轉換為秒並使用您需要的掩碼打印數字:

如果您的數組可以格式化為: ["05:00:00", "00:07:00", "00:00:05"] (因此帶有##:##:##的掩碼:

var playlist = ["5:00:00", "00:07:00", "00:00:05"];

var mask = [3600, 60, 1];
var seconds = playlist.reduce((a,b) => a + b.split(':').map((v,i) => parseInt(v) * mask[i]).reduce((x,y) => x+y,0), 0);

console.log(new Date(seconds * 1000).toISOString().substr(11, 8));

否則,要么優化reduce function 以能夠處理您關心的格式變化或將您的格式轉換為原始掩碼##:##:##並繼續算法。

更新:基於@epascarello, reduce function 的優化可以使用:

var playlist = ["05:00:00", "7:00", ":05"];

var mask = [3600, 60, 1];
var seconds = playlist.reduce(
  (a, b) => a + ("0:0:" + b.replace(/^\:/g, ""))
                            .split(':')
                            .slice(-3)
                            .map((v, i) => parseInt(v) * mask[i])
                            .reduce(
                              (x, y) => x + y,
                              0), 
  0);

console.log(new Date(seconds * 1000).toISOString().substr(11, 8));

這適用於您的所有格式約定。

您轉換為秒的方法很好。 然而遺憾的是,您的 function 將split結果的不同長度視為單獨的案例。 這會導致不必要的代碼重復。 您可以將if..else if塊替換為調用reduce

以下是它的工作原理:

 const toSeconds = dur => dur.split(":").reduce((a, b) => a*60 + +b, 0); const toDuration = secs => [ Math.floor(secs / 3600), Math.floor(secs / 60) % 60, secs % 60 ].join(":").replace(/:(\d)\b/g, ":0$1"); const addDurations = durations => toDuration( durations.map(toSeconds).reduce((a,b) => a+b) ); // demo let duration = addDurations(["5:00:00", "7:00", ":05"]); console.log(duration);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM