簡體   English   中英

將秒轉換為天、小時、分鍾和秒

[英]Convert seconds to days, hours, minutes and seconds

我有一個帶有停止按鈕的無限循環的 Javascript 計時事件。

單擊開始按鈕時它將顯示數字。現在我希望將這些數字轉換為 4 小時、3 分鍾、50 秒

 var c = 0; var t; var timer_is_on = 0; function timedCount() { document.getElementById('txt').value = c; c = c + 1; t = setTimeout(function() { timedCount() }, 1000); } function doTimer() { if (;timer_is_on) { timer_is_on = 1; timedCount(); } } function stopCount() { clearTimeout(t); timer_is_on = 0. } $(".start"),on("click". function() { //var start = $;now(); //alert(start). //console;log(start); doTimer(). $(".end");show(). $(".hide_div");show(); }). $(".end"),on("click"; function() { stopCount(); });
 .hide_div { display: none; }.end { display: none; }
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <p class="start">Start</p> <p class="end">End</p> <p class="hide_div"> <input type="text" id="txt" />//display numbers eg 12345 </p>

如何將 123456 等數字轉換為 1 天 4 小時 40 分鍾 45 秒?

我建議這樣做!:

function secondsToDhms(seconds) {
seconds = Number(seconds);
var d = Math.floor(seconds / (3600*24));
var h = Math.floor(seconds % (3600*24) / 3600);
var m = Math.floor(seconds % 3600 / 60);
var s = Math.floor(seconds % 60);

var dDisplay = d > 0 ? d + (d == 1 ? " day, " : " days, ") : "";
var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : "";
var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : "";
var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : "";
return dDisplay + hDisplay + mDisplay + sDisplay;
}

像這樣使用MathparseInt第二個參數是基數,這是可選的

 var seconds = parseInt(123456, 10); var days = Math.floor(seconds / (3600*24)); seconds -= days*3600*24; var hrs = Math.floor(seconds / 3600); seconds -= hrs*3600; var mnts = Math.floor(seconds / 60); seconds -= mnts*60; console.log(days+" days, "+hrs+" Hrs, "+mnts+" Minutes, "+seconds+" Seconds");

您給定的秒數123456將是1 days, 10 Hrs, 17 Minutes, 36 Seconds而不是1 days, 4 Hrs, 40 Minutes, 45 Seconds

function countdown(s) {

  const d = Math.floor(s / (3600 * 24));

  s  -= d * 3600 * 24;

  const h = Math.floor(s / 3600);

  s  -= h * 3600;

  const m = Math.floor(s / 60);

  s  -= m * 60;

  const tmp = [];

  (d) && tmp.push(d + 'd');

  (d || h) && tmp.push(h + 'h');

  (d || h || m) && tmp.push(m + 'm');

  tmp.push(s + 's');

  return tmp.join(' ');
}

// countdown(3546544) -> 41d 1h 9m 4s
// countdown(436654) -> 5d 1h 17m 34s
// countdown(3601) -> 1h 0m 1s
// countdown(121) -> 2m 1s

我的 map() 和 reduce() 解決方案:

 const intervalToLevels = (interval, levels) => { const cbFun = (d, c) => { let bb = d[1] % c[0], aa = (d[1] - bb) / c[0]; aa = aa > 0 ? aa + c[1] : ''; return [d[0] + aa, bb]; }; let rslt = levels.scale.map((d, i, a) => a.slice(i).reduce((d, c) => d * c)) .map((d, i) => ([d, levels.units[i]])) .reduce(cbFun, ['', interval]); return rslt[0]; }; const TimeLevels = { scale: [24, 60, 60, 1], units: ['d ', 'h ', 'm ', 's '] }; const secondsToString = interval => intervalToLevels(interval, TimeLevels);

如果你調用secondsToString(123456) ,你可以得到 "1d 10h 17m 36s "

這是我的解決方案,一個簡單的函數,將四舍五入到最接近的秒!

 var returnElapsedTime = function(epoch) { //We are assuming that the epoch is in seconds var hours = epoch / 3600, minutes = (hours % 1) * 60, seconds = (minutes % 1) * 60; return Math.floor(hours) + " hours, " + Math.floor(minutes) + " minutes, " + Math.round(seconds) + " seconds"; }

對本線程中建議的一些解決方案提出了我自己的變體。

 if (!Number.prototype.secondsToDHM) { Number.prototype.secondsToDHM = function() { const secsPerDay = 86400; const secsPerHour = 3600; const secsPerMinute = 60; var seconds = Math.abs(this); var minus = (this < 0) ? '-' : ''; var days = Math.floor(seconds / secsPerDay); seconds = (seconds % secsPerDay); var hours = Math.floor(seconds / secsPerHour); seconds = (seconds % secsPerHour); var minutes = Math.floor(seconds / secsPerMinute); seconds = (seconds % secsPerMinute); var sDays = new String(days).padStart(1, '0'); var sHours = new String(hours).padStart(2, '0'); var sMinutes = new String(minutes).padStart(2, '0'); return `${minus}${sDays}D ${sHours}:${sMinutes}`; } } var a = new Number(50000).secondsToDHM(); var b = new Number(100000).secondsToDHM(); var c = new Number(200000).secondsToDHM(); var d = new Number(400000).secondsToDHM(); console.log(a); console.log(b); console.log(c); console.log(d);

這個答案建立在Andris對這個問題的方法之上,但如果不存在較小的單位,它就沒有尾隨逗號。

它還從這個答案中借用了處理連接數組值的方法,只有當truthy

https://stackoverflow.com/a/19903063

我不是 javascript 之神,它可能被過度設計了,但希望可讀和正確!

function sformat(s) {

    // create array of day, hour, minute and second values
    var fm = [
        Math.floor(s / (3600 * 24)),
        Math.floor(s % (3600 * 24) / 3600),
        Math.floor(s % 3600 / 60),
        Math.floor(s % 60)
    ];

    // map over array
    return $.map(fm, function(v, i) {

        // if a truthy value
        if (Boolean(v)) {

            // add the relevant value suffix
            if (i === 0) {
                v = plural(v, "day");
            } else if (i === 1) {
                v = plural(v, "hour");
            } else if (i === 2) {
                v = plural(v, "minute");
            } else if (i === 3) {
                v = plural(v, "second");
            }

            return v;
        }

    }).join(', ');

}

function plural(value, unit) {

    if (value === 1) {
        return value + " " + unit;
    } else if (value > 1) {
        return value + " " + unit + "s";
    }

}


console.log(sformat(60)); // 1 minute
console.log(sformat(3600)); // 1 hour
console.log(sformat(86400)); // 1 day
console.log(sformat(8991)); // 2 hours, 29 minutes, 51 seconds

如果您需要更“隨意”地用文字表達持續時間,您還可以執行以下操作:

var remaining_duration = sformat(117);
// if a value is returned, add some prefix and suffix 
if (remaining_duration !== "") {
    remaining_duration = "about " + remaining_duration + " left";
}
$(".remaining_duration").text(remaining_duration);

// returns 'about 1 minute, 57 seconds left'

您可能會發現使用紀元時間戳更直接:如在 JavaScript中將Unix 時間戳轉換為時間中所述,基本方法如下所示:

<script>
    // Create a new JavaScript Date object based on the timestamp
    // multiplied by 1000 so that the argument is in milliseconds, not seconds.
    var date1 = new Date();

    alert ('easy trick to waste a few seconds...' + date1);


    // var date = date2 - date1;

    // Hours part from the timestamp
    var hours1 = date1.getHours();
    // Minutes part from the timestamp
    var minutes1 = "0" + date1.getMinutes();
    // Seconds part from the timestamp
    var seconds1 = "0" + date1.getSeconds();


    var date2 = new Date();

    // Hours part from the timestamp
    var hours2 = date2.getHours();
    // Minutes part from the timestamp
    var minutes2 = "0" + date2.getMinutes();
    // Seconds part from the timestamp
    var seconds2 = "0" + date2.getSeconds();


    // Will display time in 10:30:23 format
    // var formattedTime = hours + ':' + minutes.substr(-2) + ':' + seconds.substr(-2);


    var  elapsedHrs = hours2 - hours1;
    var  elapsedMin = minutes2.substr(-2) -minutes1.substr(-2);
    var elapsedSec = seconds2.substr(-2) - seconds1.substr(-2);

    var elapsedTime = elapsedHrs + ' hours, ' + elapsedMin + ' minutes, ' + elapsedSec + ' seconds';

    alert ('time between timestamps: ' + elapsedTime);
</script>

請注意,此腳本需要一些工作,因為現在它會為諸如 date1 = 12:00:00 和 date2 = 12:00:05 之類的東西提供負值,但我現在將其留給您。

您應該重寫代碼以在計時器開始時使用時間戳( var x = new Date(); ),並且在您完成/想要檢查經過時間時使用時間戳,並在解析經過的秒數,分鍾數之前減去兩者,小時等根據需要。

我已經調整了 Andris 發布的代碼https://stackoverflow.com/users/3564943/andris

            // https://stackoverflow.com/questions/36098913/convert-seconds-to-days-hours-minutes-and-seconds
        function app_ste_36098913_countdown_seconds_to_hr(seconds) {
            seconds = seconds || 0;
            seconds = Number(seconds);
            seconds = Math.abs(seconds);

            var d = Math.floor(seconds / (3600*24));
            var h = Math.floor(seconds % (3600*24) / 3600);
            var m = Math.floor(seconds % 3600 / 60);
            var s = Math.floor(seconds % 60);
            var parts = new Array();

            if (d > 0) {
                var dDisplay = d > 0 ? d + ' ' + (d == 1 ? "day" : "days") : "";
                parts.push(dDisplay);
            }

            if (h > 0) {
                var hDisplay = h > 0 ? h + ' ' + (h == 1 ? "hour" : "hours") : "";
                parts.push(hDisplay)
            }

            if (m > 0) {
                var mDisplay = m > 0 ? m + ' ' + (m == 1 ? "minute" : "minutes") : "";
                parts.push(mDisplay)
            }

            if (s > 0) {
                var sDisplay = s > 0 ? s + ' ' + (s == 1 ? "second" : "seconds") : "";
                parts.push(sDisplay)
            }

            return parts.join(', ', parts);
        }

我進一步調整了Svetoslav的代碼,如下所示:

function convertSecondsToReadableString(seconds) {
  seconds = seconds || 0;
  seconds = Number(seconds);
  seconds = Math.abs(seconds);

  const d = Math.floor(seconds / (3600 * 24));
  const h = Math.floor(seconds % (3600 * 24) / 3600);
  const m = Math.floor(seconds % 3600 / 60);
  const s = Math.floor(seconds % 60);
  const parts = [];

  if (d > 0) {
    parts.push(d + ' day' + (d > 1 ? 's' : ''));
  }

  if (h > 0) {
    parts.push(h + ' hour' + (h > 1 ? 's' : ''));
  }

  if (m > 0) {
    parts.push(m + ' minute' + (m > 1 ? 's' : ''));
  }

  if (s > 0) {
    parts.push(s + ' second' + (s > 1 ? 's' : ''));
  }

  return parts.join(', ');
}

簡短的回答:

var s = (Math.floor(123456/86400) + ":" + (new Date(123456 * 1000)).toISOString().substr(11, 8)).split(":");
console.log(`${s[0]} days, ${s[1]} hours, ${s[2]} minutes, ${s[3]} seconds` )

這是我對這個問題的看法,即使這是一個老話題。

您可以使用循環為您計算所有內容:

 function time_remaining(date1, date2) { let seconds = (date2 - date1) / 1000 let units = ["years", "days", "h", "min", "s"] let limit_units = [365, 24, 60, 60, 1] const reducer = (accumulator, curr) => accumulator * curr; let time = [] for (let i = 0; i < units.length; i++) { let divisor = limit_units.slice(i).reduce(reducer) let value = Math.floor(seconds / divisor) seconds = seconds - value * divisor time.push(value) } return clean_time(time, units) } // at this point, you have your answer. However, // we can improve the result by removing all none // significative null units (ie, if your countdown is // only about hours, minutes and seconds, it is not // going to include years and days.) function clean_time(time, units) { time = time.reverse() while (time[time.length - 1] == 0) { time.pop() } return [time.reverse(), units.slice(-time.length)] } let date1 = Date.parse("2023-07-09T17:50:33") console.log(time_remaining(Date.now(), date1))

暫無
暫無

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

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