Convertire l’intervallo di tempo dato in secondi in una forma più leggibile

Ho bisogno di un frammento di codice per convertire la quantità di tempo data dal numero di secondi in qualche forma leggibile dall’uomo. La funzione dovrebbe ricevere un numero e generare una stringa come questa:

34 seconds 12 minutes 4 hours 5 days 4 months 1 year 

Nessuna formattazione richiesta, il formato hard-coded andrà.

  function secondsToString(seconds) { var numyears = Math.floor(seconds / 31536000); var numdays = Math.floor((seconds % 31536000) / 86400); var numhours = Math.floor(((seconds % 31536000) % 86400) / 3600); var numminutes = Math.floor((((seconds % 31536000) % 86400) % 3600) / 60); var numseconds = (((seconds % 31536000) % 86400) % 3600) % 60; return numyears + " years " + numdays + " days " + numhours + " hours " + numminutes + " minutes " + numseconds + " seconds"; } 

Con l’aiuto di Royi abbiamo il codice che emette l’intervallo di tempo in una forma leggibile dall’uomo :

 function millisecondsToStr (milliseconds) { // TIP: to find current time in milliseconds, use: // var current_time_milliseconds = new Date().getTime(); function numberEnding (number) { return (number > 1) ? 's' : ''; } var temp = Math.floor(milliseconds / 1000); var years = Math.floor(temp / 31536000); if (years) { return years + ' year' + numberEnding(years); } //TODO: Months! Maybe weeks? var days = Math.floor((temp %= 31536000) / 86400); if (days) { return days + ' day' + numberEnding(days); } var hours = Math.floor((temp %= 86400) / 3600); if (hours) { return hours + ' hour' + numberEnding(hours); } var minutes = Math.floor((temp %= 3600) / 60); if (minutes) { return minutes + ' minute' + numberEnding(minutes); } var seconds = temp % 60; if (seconds) { return seconds + ' second' + numberEnding(seconds); } return 'less than a second'; //'just now' //or other string you like; } 

Se sei interessato a una libreria javascript esistente che svolge il lavoro molto bene, ti consigliamo di controllare moment.js .

Più specificamente, il pezzo moment.js rilevante per la tua domanda è la durata .

Ecco alcuni esempi di come puoi trarne vantaggio per raggiungere il tuo compito:

 var duration = moment.duration(31536000); // Using the built-in humanize function: console.log(duration.humanize()); // Output: "9 hours" console.log(duration.humanize(true)); // Output: "in 9 hours" 

moment.js ha il supporto integrato per oltre 50 lingue umane, quindi se usi il metodo humanize() ottieni gratuitamente il supporto multilingue.

Se desideri visualizzare le informazioni sull’ora esatta, puoi sfruttare il plug-in per il momento preciso della gamma per moment.js creato appositamente per questo scopo:

 console.log(moment.preciseDiff(0, 39240754000); // Output: 1 year 2 months 30 days 5 hours 12 minutes 34 seconds 

Una cosa da notare è che moment.js attualmente non supporta settimane / giorni (in settimana) per object durata.

Spero che questo ti aiuti!

Prova a seguire:

 seconds = ~~(milliseconds / 1000); minutes = ~~(seconds / 60); hours = ~~(minutes / 60); days = ~~(hours / 24); weeks = ~~(days / 7); year = ~~(days / 365); 

Nota:

  • Un anno normale ha 365 giorni. Un anno bisestile ha 366 giorni, quindi è necessario un ulteriore controllo se questo è un problema per te.
  • Il problema simile all’ora legale. Alcuni giorni hanno 23 e circa 25 ore quando il tempo è cambiato.

Conclusione: questo è uno snippet rude ma piccolo e semplice 🙂

 millisToTime = function(ms){ x = ms / 1000; seconds = Math.round(x % 60); x /= 60; minutes = Math.round(x % 60); x /= 60; hours = Math.round(x % 24); x /= 24; days = Math.round(x); return {"Days" : days, "Hours" : hours, "Minutes" : minutes, "Seconds" : seconds}; } 

Questo richiederà millisecondi come int e ti darà un object JSON contenente tutte le informazioni di cui potresti aver bisogno

Molto più semplice e leggibile.

 milliseconds = 12345678; mydate=new Date(milliseconds); humandate=mydate.getUTCHours()+" hours, "+mydate.getUTCMinutes()+" minutes and "+mydate.getUTCSeconds()+" second(s)"; 

Che dà:

“3 ore, 25 minuti e 45 secondi (s)”

Ho preso uno swing basato sulla risposta di @ Royi:

 /** * Translates seconds into human readable format of seconds, minutes, hours, days, and years * * @param {number} seconds The number of seconds to be processed * @return {string} The phrase describing the the amount of time */ function forHumans ( seconds ) { var levels = [ [Math.floor(seconds / 31536000), 'years'], [Math.floor((seconds % 31536000) / 86400), 'days'], [Math.floor(((seconds % 31536000) % 86400) / 3600), 'hours'], [Math.floor((((seconds % 31536000) % 86400) % 3600) / 60), 'minutes'], [(((seconds % 31536000) % 86400) % 3600) % 60, 'seconds'], ]; var returntext = ''; for (var i = 0, max = levels.length; i < max; i++) { if ( levels[i][0] === 0 ) continue; returntext += ' ' + levels[i][0] + ' ' + (levels[i][0] === 1 ? levels[i][1].substr(0, levels[i][1].length-1): levels[i][1]); }; return returntext.trim(); } 

La cosa bella della mia è che non c'è ripetizione if s, e non ti darà 0 anni 0 giorni 30 minuti 1 secondo per esempio.

Per esempio:

forHumans(60) emette 1 minute

forHumans(3600) emette 1 hour

e forHumans(13559879) emette 156 days 22 hours 37 minutes 59 seconds

 function millisecondsToString(milliseconds) { var oneHour = 3600000; var oneMinute = 60000; var oneSecond = 1000; var seconds = 0; var minutes = 0; var hours = 0; var result; if (milliseconds >= oneHour) { hours = Math.floor(milliseconds / oneHour); } milliseconds = hours > 0 ? (milliseconds - hours * oneHour) : milliseconds; if (milliseconds >= oneMinute) { minutes = Math.floor(milliseconds / oneMinute); } milliseconds = minutes > 0 ? (milliseconds - minutes * oneMinute) : milliseconds; if (milliseconds >= oneSecond) { seconds = Math.floor(milliseconds / oneSecond); } milliseconds = seconds > 0 ? (milliseconds - seconds * oneSecond) : milliseconds; if (hours > 0) { result = (hours > 9 ? hours : "0" + hours) + ":"; } else { result = "00:"; } if (minutes > 0) { result += (minutes > 9 ? minutes : "0" + minutes) + ":"; } else { result += "00:"; } if (seconds > 0) { result += (seconds > 9 ? seconds : "0" + seconds) + ":"; } else { result += "00:"; } if (milliseconds > 0) { result += (milliseconds > 9 ? milliseconds : "0" + milliseconds); } else { result += "00"; } return result; } 

Per convertire il tempo in millisecondo in formato leggibile dall’uomo.

  function timeConversion(millisec) { var seconds = (millisec / 1000).toFixed(1); var minutes = (millisec / (1000 * 60)).toFixed(1); var hours = (millisec / (1000 * 60 * 60)).toFixed(1); var days = (millisec / (1000 * 60 * 60 * 24)).toFixed(1); if (seconds < 60) { return seconds + " Sec"; } else if (minutes < 60) { return minutes + " Min"; } else if (hours < 24) { return hours + " Hrs"; } else { return days + " Days" } } 

Questa funzione emette secondi in questo formato: 11h 22m, 1y 244d, 42m 4s ecc. Imposta la variabile max per mostrare tutti gli identificatori che vuoi.

 function secondsToString (seconds) { var years = Math.floor(seconds / 31536000); var max =2; var current = 0; var str = ""; if (years && current 

Per mostrare solo ciò di cui hai bisogno e non il giorno 0, ore 0 …

 formatTime = function(time) { var ret = time % 1000 + ' ms'; time = Math.floor(time / 1000); if (time !== 0) { ret = time % 60 + "s "+ret; time = Math.floor(time / 60); if (time !== 0) { ret = time % 60 + "min "+ret; time = Math.floor(time / 60); if (time !== 0) { ret = time % 60 + "h "+ret; ... } } } return ret; }; 

Con l’aiuto di Dan answer, ho trovato questo se vuoi calcolare la differenza tra il tempo di post-creazione (da DB dovrebbe essere recuperato come UTC) e il tempo di sistema degli utenti e poi mostrare loro il tempo trascorso, potresti usare sotto la funzione

 function dateToStr(input_date) { input_date= input_date+" UTC"; // convert times in milliseconds var input_time_in_ms = new Date(input_date).getTime(); var current_time_in_ms = new Date().getTime(); var elapsed_time = current_time_in_ms - input_time_in_ms; function numberEnding (number) { return (number > 1) ? 's' : ''; } var temp = Math.floor(elapsed_time / 1000); var years = Math.floor(temp / 31536000); if (years) { return years + ' year' + numberEnding(years); } //TODO: Months! Maybe weeks? var days = Math.floor((temp %= 31536000) / 86400); if (days) { return days + ' day' + numberEnding(days); } var hours = Math.floor((temp %= 86400) / 3600); if (hours) { return hours + ' hour' + numberEnding(hours); } var minutes = Math.floor((temp %= 3600) / 60); if (minutes) { return minutes + ' minute' + numberEnding(minutes); } var seconds = temp % 60; if (seconds) { return seconds + ' second' + numberEnding(seconds); } return 'less than a second'; //'just now' //or other string you like; } 

ad es .: utilizzo

 var str = dateToStr('2014-10-05 15:22:16'); 

Questa è una soluzione. Successivamente puoi dividere per “:” e prendere i valori dell’array

  /** * Converts milliseconds to human readeable language separated by ":" * Example: 190980000 --> 2:05:3 --> 2days 5hours 3min */ function dhm(t){ var cd = 24 * 60 * 60 * 1000, ch = 60 * 60 * 1000, d = Math.floor(t / cd), h = '0' + Math.floor( (t - d * cd) / ch), m = '0' + Math.round( (t - d * cd - h * ch) / 60000); return [d, h.substr(-2), m.substr(-2)].join(':'); } //Example var delay = 190980000; var fullTime = dhm(delay); console.log(fullTime); 

Sono un grande fan degli oggetti, quindi l’ho creato da https://metacpan.org/pod/Time::Seconds

Uso:

 var human_readable = new TimeSeconds(986543).pretty(); // 11 days, 10 hours, 2 minutes, 23 seconds ;(function(w) { var interval = { second: 1, minute: 60, hour: 3600, day: 86400, week: 604800, month: 2629744, // year / 12 year: 31556930 // 365.24225 days }; var TimeSeconds = function(seconds) { this.val = seconds; }; TimeSeconds.prototype.seconds = function() { return parseInt(this.val); }; TimeSeconds.prototype.minutes = function() { return parseInt(this.val / interval.minute); }; TimeSeconds.prototype.hours = function() { return parseInt(this.val / interval.hour); }; TimeSeconds.prototype.days = function() { return parseInt(this.val / interval.day); }; TimeSeconds.prototype.weeks = function() { return parseInt(this.val / interval.week); }; TimeSeconds.prototype.months = function() { return parseInt(this.val / interval.month); }; TimeSeconds.prototype.years = function() { return parseInt(this.val / interval.year); }; TimeSeconds.prototype.pretty = function(chunks) { var val = this.val; var str = []; if(!chunks) chunks = ['day', 'hour', 'minute', 'second']; while(chunks.length) { var i = chunks.shift(); var x = parseInt(val / interval[i]); if(!x && chunks.length) continue; val -= interval[i] * x; str.push(x + ' ' + (x == 1 ? i : i + 's')); } return str.join(', ').replace(/^-/, 'minus '); }; w.TimeSeconds = TimeSeconds; })(window); 

Ho pulito una delle altre risposte un po ‘fornisce delle stringhe di stile “10 secondi fa”:

 function msago (ms) { function suffix (number) { return ((number > 1) ? 's' : '') + ' ago'; } var temp = ms / 1000; var years = Math.floor(temp / 31536000); if (years) return years + ' year' + suffix(years); var days = Math.floor((temp %= 31536000) / 86400); if (days) return days + ' day' + suffix(days); var hours = Math.floor((temp %= 86400) / 3600); if (hours) return hours + ' hour' + suffix(hours); var minutes = Math.floor((temp %= 3600) / 60); if (minutes) return minutes + ' minute' + suffix(minutes); var seconds = Math.floor(temp % 60); if (seconds) return seconds + ' second' + suffix(seconds); return 'less then a second ago'; }; 

Seguendo un approccio simile a @ Dan, ho modificato il codice di @Royi Namir per produrre una stringa con virgole e ed:

 secondsToString = function(seconds) { var numdays, numhours, nummilli, numminutes, numseconds, numyears, res; numyears = Math.floor(seconds / 31536000); numdays = Math.floor(seconds % 31536000 / 86400); numhours = Math.floor(seconds % 31536000 % 86400 / 3600); numminutes = Math.floor(seconds % 31536000 % 86400 % 3600 / 60); numseconds = seconds % 31536000 % 86400 % 3600 % 60; nummilli = seconds % 1.0; res = []; if (numyears > 0) { res.push(numyears + " years"); } if (numdays > 0) { res.push(numdays + " days"); } if (numhours > 0) { res.push(numhours + " hours"); } if (numminutes > 0) { res.push(numminutes + " minutes"); } if (numseconds > 0) { res.push(numminutes + " seconds"); } if (nummilli > 0) { res.push(nummilli + " milliseconds"); } return [res.slice(0, -1).join(", "), res.slice(-1)[0]].join(res.length > 1 ? " and " : ""); }; 

Non ha periodo quindi puoi aggiungere frasi dopo, come qui:

 perform: function(msg, custom, conn) { var remTimeLoop; remTimeLoop = function(time) { if (time !== +custom[0]) { msg.reply((secondsToString(time)) + " remaining!"); } if (time > 15) { return setTimeout((function() { return remTimeLoop(time / 2); }), time / 2); } }; // ... remTimeLoop(+custom[0]); } 

Dove custom[0] è il tempo totale di attesa; continuerà a dividere il tempo per 2, avvertendo il tempo rimanente fino alla fine del timer, e interromperà l’avviso una volta che il tempo è inferiore a 15 secondi.

 function secondsToTimeString(input) { let years = 0, days = 0, hours = 0, minutes = 0, seconds = 0; let ref = [31536000,86400,3600,60,1]; for (let i = 0;i < ref.length;i++) { let val = ref[i]; while (val <= input) { input -= val; if (i === 0) years++; if (i === 1) days++; if (i === 2) hours++; if (i === 3) minutes++; if (i === 4) seconds++; } 

ritorno {anni, giorni, ore, minuti, secondi}; }