2011-12-16 112 views
9

Estoy calculando la diferencia entre 2 fechas para las que hay muchos ejemplos diferentes disponibles. El tiempo devuelto es en milisegundos, así que necesito convertirlo en algo más útil.Javascript show milisegundos como días: horas: minutos sin segundos

La mayoría de los ejemplos son por días: horas: minutos: segundos u horas: minutos, pero necesito días: horas: minutos por lo que los segundos deben redondearse en minutos.

El método que estoy usando actualmente se acerca, pero muestra 3 días como 2.23.60 cuando debería mostrar 3.00.00 así que algo no está del todo bien. Como acabo de tomar el código actual de un ejemplo en la web, estoy abierto a sugerencias sobre otras formas de hacerlo.

estoy obteniendo el tiempo en milisegundos restando una fecha de inicio a partir de una fecha de finalización de la siguiente manera: -

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

básicamente necesito tomar la variable ms y entregar en days.hours: minutos.

+2

¿Te gustaría compartir algún código? –

+0

¡Parece que "el método que está usando actualmente" es casi correcto! ¿Por qué no arreglarlo? –

+0

¿Puedes publicar un código para lo que estás haciendo? Definitivamente parece que lo estás haciendo mal. Además, consulte http://stackoverflow.com/questions/1056728/formatting-a-date-in-javascript – austinfromboston

Respuesta

17

Algo como esto?

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

Muchas gracias Mic, de todos los ejemplos encontré que su código es el más confiable cuando arroja valores diferentes en él. Muy apreciado. – Mitch

1

"El tiempo devuelto es en milisegundos, así que tengo que convertirlo en algo más útil".

¿Está recuperando el tiempo de un servidor o este es javascript puro?

Cierto código sería realmente ayuda. "Algo útil" es algo vago.

Aquí hay un ejemplo, creo que esto es de lo que estás hablando.

<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

[No hubo año 0] (http://en.wikipedia.org/wiki/Year_0). Debe usar 1/1/2001 como su fecha de referencia. – aroth

0

Sin código, es difícil saber exactamente qué error que tiene, pero sospecho que está haciendo exactamente como lo pronunció: redondeo al alza. Si redondeo no es lo suficientemente bueno para usted, aquí es cómo redondear al más cercano:

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

y luego continuar con el cálculo.

3

Aquí van:

http://jsfiddle.net/uNnfH/1

O si usted no quiere jugar con un ejemplo correr, entonces:

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

Gracias por su sugerencia aroth, terminé con muchos enfoques diferentes y fue una cosa de cerca con cuál fui. No había visto jsfiddle antes, así que gracias por presentarme. – Mitch

2

No sé cuántas respuestas que necesita, pero aquí hay otra - sólo otra toma en algunas respuestas que ya han sido dados:

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;} 
} 

Tenga cuidado con estos cálculos, sin embargo, los períodos de paso ahorrar límites luz del día causará problemas Siempre es mejor trabajar en UTC y convertir a horas locales para la presentación.

+0

Gracias por el consejo RobG, lo tendré en cuenta. – Mitch

11

Suena como un trabajo para 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 

Hay una tonelada de otras formas de formatear las duraciones en MomentJS.El docs es muy completo.

4

no sé por qué, pero los otros no funcionó para mí, así que aquí es mío

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

impresionante !!!!!!!!!!!!!!! – Edit

0

Con moment.js Prueba esto:

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

Cuando se quiere mostrar horas que tienen que tienen una solución:

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

esta solución se introdujo en el momento en este Issue.

Cuestiones relacionadas