2011-12-16 24 views
9

Sto calcolando la differenza tra 2 date per le quali sono disponibili molti esempi diversi. Il tempo restituito è in millisecondi, quindi ho bisogno di convertirlo in qualcosa di più utile.Javascript mostra millisecondi come giorni: ore: minuti senza secondi

maggior parte degli esempi sono da giorni: ore: minuti: secondi o ore: minuti, ma ho bisogno giorni: ore: minuti in modo che i secondi va arrotondato a verbale.

Il metodo che sto usando attualmente si avvicina ma mostra 3 giorni come 2.23.60 quando dovrebbe mostrare 3.00.00, quindi qualcosa non va bene. Come ho appena afferrato il codice corrente da un esempio sul web, sono aperto a suggerimenti per altri modi di farlo.

che sto ottenendo il tempo in millisecondi sottraendo una data di inizio da una data di fine come segue: -

date1 = new Date(startDateTime); 
date2 = new Date(endDateTime); 
ms = Math.abs(date1 - date2) 

Io fondamentalmente bisogno di prendere la variabile ms e girare in in giorni.ore: minuti.

+2

Attenzione a condividere qualche codice? –

+0

Suoni come "il metodo che stai usando attualmente" è quasi corretto! Perché non aggiustarlo? –

+0

Puoi pubblicare del codice per quello che stai facendo? Sembra decisamente che tu stia sbagliando. Inoltre, controlla http://stackoverflow.com/questions/1056728/formatting-a-date-in-javascript – austinfromboston

risposta

17

qualcosa di simile?

function dhm(t){ 
    var cd = 24 * 60 * 60 * 1000, 
     ch = 60 * 60 * 1000, 
     d = Math.floor(t/cd), 
     h = Math.floor((t - d * cd)/ch), 
     m = Math.round((t - d * cd - h * ch)/60000), 
     pad = function(n){ return n < 10 ? '0' + n : n; }; 
    if(m === 60){ 
    h++; 
    m = 0; 
    } 
    if(h === 24){ 
    d++; 
    h = 0; 
    } 
    return [d, pad(h), pad(m)].join(':'); 
} 

console.log(dhm(3 * 24 * 60 * 60 * 1000)); 
+1

Mille grazie Mic, tra tutti gli esempi ho trovato il tuo codice il più affidabile quando lanci valori diversi. Molto apprezzato. – Mitch

1

"Il tempo restituito è in millisecondi, quindi ho bisogno di convertirlo in qualcosa di più utile."

Stai ottenendo il tempo di ritorno da un server o è puro javascript?

Un po 'di codice sarebbe aiuto proprio. "Qualcosa di utile" è un po 'vago.

Ecco un esempio, penso che questo sia ciò di cui stai parlando.

<script type="text/javascript"> 

//Set the two dates 
var millennium =new Date(2000, 0, 1) //Month is 0-11 in JavaScript 
today=new Date() 
//Get 1 day in milliseconds 
var one_day=1000*60*60*24 

//Calculate difference btw the two dates, and convert to days 
document.write(Math.ceil((today.getTime()-millennium.getTime())/(one_day))+ 
" days has gone by since the millennium!") 

</script> 
4367 days has gone by since the millennium! 
+0

[Non c'era nessun anno 0] (http://en.wikipedia.org/wiki/Year_0). Dovresti usare 1/1/2001 come data di riferimento. – aroth

0

senza codice, è difficile dire esattamente quale errore che hai, ma ho il sospetto che stai facendo esattamente come hai detto: arrotondamento. Se l'arrotondamento verso il basso non è abbastanza buono per voi, ecco come fare per arrotondare al più vicino:

var time = date.getTime(); 
if (time % 60000 >= 30000) time += 60000; 

e poi continuare con il calcolo.

3

Qui si va:

http://jsfiddle.net/uNnfH/1

Oppure, se non si vuole giocare con un esempio di esecuzione, quindi:

window.minutesPerDay = 60 * 24; 

function pad(number) { 
    var result = "" + number; 
    if (result.length < 2) { 
     result = "0" + result; 
    } 

    return result; 
} 

function millisToDaysHoursMinutes(millis) { 
    var seconds = millis/1000; 
    var totalMinutes = seconds/60; 

    var days = totalMinutes/minutesPerDay; 
    totalMinutes -= minutesPerDay * days; 
    var hours = totalMinutes/60; 
    totalMinutes -= hours * 60; 

    return days + "." + pad(hours) + "." + pad(totalMinutes); 
} 
+0

Grazie per il tuo suggerimento, mi sono ritrovato con molti approcci diversi ed è stata una cosa da vicino con cui sono andato. Non avevo ancora visto jsfiddle, quindi grazie per avermi fatto conoscere. – Mitch

2

Non so quante risposte hai bisogno, ma ecco un altro - solo un altro assumere alcune risposte che sono già state date:

function msToDHM(v) { 
    var days = v/8.64e7 | 0; 
    var hrs = (v % 8.64e7)/ 3.6e6 | 0; 
    var mins = Math.round((v % 3.6e6)/6e4); 

    return days + ':' + z(hrs) + ':' + z(mins); 

    function z(n){return (n<10?'0':'')+n;} 
} 

Fate attenzione a tali calcoli però, periodi che attraversano ora legale confini causerà problemi. Sempre meglio lavorare in UTC e convertire in orari locali per la presentazione.

+0

Grazie per il suggerimento RobG, lo terrò a mente. – Mitch

11

Sembra un lavoro per Moment.js.

var diff = new moment.duration(ms); 
diff.asDays();  // # of days in the duration 
diff.asHours(); // # of hours in the duration 
diff.asMinutes(); // # of minutes in the duration 

Ci sono molti altri modi per formattare le durate in MomentJS.Il docs sono molto completi.

4

Non so perché, ma gli altri non ha funzionato per me: ecco il mio

function dhm(ms){ 
    days = Math.floor(ms/(24*60*60*1000)); 
    daysms=ms % (24*60*60*1000); 
    hours = Math.floor((daysms)/(60*60*1000)); 
    hoursms=ms % (60*60*1000); 
    minutes = Math.floor((hoursms)/(60*1000)); 
    minutesms=ms % (60*1000); 
    sec = Math.floor((minutesms)/(1000)); 
    return days+":"+hours+":"+minutes+":"+sec; 
} 

alert(dhm(500000)); 
+0

fantastico !!!!!!!!!!!!!!! – Edit

0

Con moment.js provare questo:

function getFormattedMs(ms) { 
    var duration = moment.duration(ms); 
    return moment.utc(duration.asMilliseconds()).format("mm:ss"); 
} 

Quando si desidera mostrare ore si deve avere una soluzione alternativa:

function formatDuration(ms) { 
    var duration = moment.duration(ms); 
    return Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss"); 
} 

questa soluzione nel momento in cui è stato introdotto in questo Issue.

Problemi correlati