2009-05-04 9 views
5

Io fondamentalmente voglio produrre il seguente:C'è un buon plugin jQuery o codice JS per durate di tempo?

da int 67 a 1 minuto 7 secondi

da int 953 a 15 minuti 53 secondi

da int 3869-1 ora 4 minuti 29 secondi

codice

pseudo:

// original 
<span class="time">67</span> 

//output 
<span class="time">1 minute 7 seconds</span> 

// js 
$('.time').format_duration(); 
+0

Penso che questo è più di un Domanda JavaScript oltre a una domanda jQuery. Quello che stai chiedendo è davvero fuori dalla portata di ciò che jQuery è per ... –

+0

Probabilmente hai ragione, ma ho pensato di renderlo correlato a jquery nel caso di un plugin disponibile ... Sto iniziando a codificare qualcosa ora, ma sono sicuro che questo codice sia disponibile da qualche parte ... – farinspace

+0

In realtà, se ricordo che c'era un post sul blog di SO ho generato i suoi timestamp in modo "umano-amichevole" ... Pensavo che ci fosse del codice sorgente che sarebbe utile lì ma non riesco a trovarlo ora. –

risposta

9

Prendendo in prestito la maggior parte della risposta di Guffa, questo dovrebbe fare il trucco come un plugin jQuery:

jQuery.fn.time_from_seconds = function() { 
    return this.each(function() { 
     var t = parseInt($(this).text(), 10); 
     $(this).data('original', t); 
     var h = Math.floor(t/3600); 
     t %= 3600; 
     var m = Math.floor(t/60); 
     var s = Math.floor(t % 60); 
     $(this).text((h > 0 ? h + ' hour' + ((h > 1) ? 's ' : ' ') : '') + 
        (m > 0 ? m + ' minute' + ((m > 1) ? 's ' : ' ') : '') + 
        s + ' second' + ((s > 1) ? 's' : '')); 
    }); 
}; 

Se si dispone di HTML in questo modo:

<span class='time'>67</span> 
<span class='time'>953</span> 
<span class='time'>3869</span> 

E si chiama in questo modo:

$('.time').time_from_seconds(); 

Il codice HTML è rivolta a:

<span class="time">1 minute 7 seconds</span> 
<span class="time">15 minutes 53 seconds</span> 
<span class="time">1 hour 4 minutes 29 seconds</span> 

Ogni elemento ha anche un data attribute di 'originale' con i secondi che originariamente conteneva.

La mia risposta risponde direttamente alla tua domanda, ma ho intenzione di fare un salto nel buio: se si desidera mostrare quanto tempo fa è successo qualcosa nel tempo umano (cioè, "5 minuti fa") c'è il jQuery timeago plugin per questo. Non penso che accetti secondi come formato, però. Deve essere una data ISO 8601.

0

Usa setTimeout (espressione, milisecs)

dove espressione può essere la funzione da chiamare quando il tempo in milisecs è completata.

Un buon esempio manipolare vari segnalini tempo si possono trovare presso: http://www.plus2net.com/javascript_tutorial/timer-set.php

+0

Sono abbastanza sicuro che l'OP voglia funzioni per convertire il tempo in secondi in una stringa di h, m, s, ecc ... –

+0

Zack hai ragione, ora prima dell'edizione posso vedere qual è lo scopo della domanda – backslash17

0

Non è elegante, ma dovrebbe funzionare:

function format_duration(elem) { 
var num = parseInt($(elem).text()); 
var hours = 0; 
var mins = 0; 
var secs = 0; 
while (num > 0) { 
    if (num < 60) { 
    secs += num; 
    num = 0; 
    } 
    else if (num < 3600) { 
    mins++; 
    num -= 60; 
    } 
    else if (num < 86400) { 
    hours++; 
    num -= 3600; 
    } 
} 
var rv = ""; 
if (hours > 0) { 
    rv += hours+" hours "; 
} 
if (mins > 0) { 
    rv += mins+" mins "; 
} 
if (secs > 0) { 
    rv += secs+" secs "; 
} 
$(elem).text(rv); 
} 

(aggiornato per rispondere utilizzo jQuery troppo)

3

Dare l'elemento id è facilmente accessibile:

<span id="time">67</span> 

Ora è possibile ottenere il valore e convertirlo:

var o = document.getElementById('time'); 
var t = parseInt(o.innerHTML); 
var h = Math.floor(t/3600); 
t %= 3600; 
var m = Math.floor(t/60); 
var s = t % 60; 
o.innerHTML = 
    (h > 0 ? h + ' hours ' : '') + 
    (m > 0 ? m + ' minutes ' : '') + 
    s + ' seconds'; 

Edit:
Aggiunto Math.floor() come suggerito da Mike B.

0

bello Guffa. Avrai bisogno di aggiungere un po ' "pavimento" chiamate in là, però:

<snip> 
    var h = Math.floor(t/3600); 
    t %= 3600; 
    var m = Math.floor(t/60); 
<snip> 
6
<html> 
<head> 
<script language="javascript" type="text/javascript" src="jquery.js"></script> 
<script> 

var tbl = [ 
    [ 7*24*60*60, 'week' ], 
    [ 24*60*60, 'day' ], 
    [ 60*60, 'hour' ], 
    [ 60, 'minute' ], 
    [ 1, 'second' ] 
]; 

function convert() { 
    var t = parseInt($('#val').val()); 
    var r = ''; 
    for (var i = 0; i < tbl.length; i++) { 
     var d = tbl[i]; 
     if (d[0] < t) { 
      var u = Math.floor(t/d[0]); 
      t -= u * d[0]; 
      r += u + ' ' + d[1] + (u == 1 ? ' ' : 's '); 
     } 
    } 
    $('#result').html(r); 
} 

</script> 
</head> 
<body> 
<input id='val' type='text' size='10' /> 
<input type='button' value='convert' onclick='convert()' /> 
<div id='result' /> 
</body> 
</html> 
1

Nel caso in cui siete alla ricerca di qualcosa di più conciso, e volete evitare gli spazi e pluralizzazione errato finali questioni di alcuni degli altri tentativi:

function timeString(t) { 
    var ret = [], t = { 
     hour: parseInt(t/3600), 
     minute: parseInt(t/60%60), 
     second: t%60 
    }; 

    for (var n in t) 
     t[n] && ret.push(t[n], n + "s".substr(t[n] < 2)); 

    return ret.join(" "); 
} 
Problemi correlati