2011-10-18 21 views
7

Supongamos que tengo un número que representa los minutos transcurridos desde la hora de inicio hasta ahora.Convierte minutos en días, semanas, meses y años

Quiero crear una función que devuelva los años, meses, semanas y días correspondientes a los minutos que paso a esa función.

Aquí un ejemplo:

var minutes = 635052; // 635052 = (24*60)*365 + (24*60)*30*2 + (24*60)*14 + (24*60)*2 + 12; 
getDataHR(minutes); // 1 year, 2 months, 2 week, 2 days, 12 minutes 

function getDataHR (newMinutes) { 
     minutes = newMinutes; 
     ....... 
     return hrData; // 1 year, 2 months, 2 week, 2 days, 12 minutes 
} 

¿Cuál es la mejor manera de lograr el resultado?

+1

¿Utiliza alguna fecha de referencia para 0 minutos? Puede ser necesario para calcular la longitud correcta del mes. – biziclop

+0

Sí, la referencia de 0 minutos es la fecha actual. Entonces 'var minutes = 2;' significa 2 minutos a partir de ahora. – antonjs

+0

Tendrás que ser mucho más preciso para obtener una respuesta decente. ¿A qué te refieres con "meses, semanas y días"? Hoy es 18 de octubre. ¿Cuántos meses, semanas y días hay entre ahora y el mismo tiempo el 29 de noviembre (35 días)? ¿Cuántos días hay entre las 11:59 PM de hoy y las 12:01 a.m. mañana? ¿Cero? ¿Uno? –

Respuesta

10

Tal como esto ?

var units = { 
    "year": 24*60*365, 
    "month": 24*60*30, 
    "week": 24*60*7, 
    "day": 24*60, 
    "minute": 1 
} 

var result = [] 

for(var name in units) { 
    var p = Math.floor(value/units[name]); 
    if(p == 1) result.push(p + " " + name); 
    if(p >= 2) result.push(p + " " + name + "s"); 
    value %= units[name] 

} 
4

Es necesario utilizar la división y módulo:

function getDataHR (newMinutes) { 
    var hrData = ""; 

    var years = minutes/YEAR_IN_MINUTES; // int division = no remainder 
    hrData += years + "years"; 
    minutes = minutes % YEAR_IN_MINUTES; 

    // ... continue for months, weeks, days, hours, etc. in that order 

    return hrData; // 1 year, 2 months, 2 week, 2 days, 12 minutes 
} 
+0

¿Por qué es la división int y no float? – jgritty

+0

En javascript, puede convertirse en un flotador. Entonces puedes rodearlo con 'Math.floor (...)' para redondearlo. – jtfairbank

5

lo hice así, porque yo ni siquiera sabía que había un operador módulo en javascript:

var minutes = 635052; // 635052 = (24*60)*365 + (24*60)*30*2 + (24*60)*14 + (24*60)*2 + 12; 
getDataHR(minutes); // 1 year, 2 months, 2 week, 2 days, 12 minutes 

function getDataHR (newMinutes) { 
    MINS_PER_YEAR = 24 * 365 * 60 
    MINS_PER_MONTH = 24 * 30 * 60 
    MINS_PER_WEEK = 24 * 7 * 60 
    MINS_PER_DAY = 24 * 60 
    minutes = newMinutes; 
    years = Math.floor(minutes/MINS_PER_YEAR) 
    minutes = minutes - years * MINS_PER_YEAR 
    months = Math.floor(minutes/MINS_PER_MONTH) 
    minutes = minutes - months * MINS_PER_MONTH 
    weeks = Math.floor(minutes/MINS_PER_WEEK) 
    minutes = minutes - weeks * MINS_PER_WEEK 
    days = Math.floor(minutes/MINS_PER_DAY) 
    minutes = minutes - days * MINS_PER_DAY 
    return years + " year(s) " + months + " month(s) " + weeks + " week(s) " + days + " day(s) " + minutes + " minute(s)" 
    //return hrData; // 1 year, 2 months, 2 week, 2 days, 12 minutes 
} 
6

edificio fuera de thg435's response above, he creado una función que convierte segundos a días, horas, minutos y segundos:

function secondsToString(seconds) 
{ 
    var value = seconds; 

    var units = { 
     "day": 24*60*60, 
     "hour": 60*60, 
     "minute": 60, 
     "second": 1 
    } 

    var result = [] 

    for(var name in units) { 
    var p = Math.floor(value/units[name]); 
    if(p == 1) result.push(" " + p + " " + name); 
    if(p >= 2) result.push(" " + p + " " + name + "s"); 
    value %= units[name] 
    } 

    return result; 

} 

También he añadido algunos espacios para el resultado de dar las comas algo de espacio . La salida se ve así:

1 day, 3 hours, 52 minutes, 7 seconds. 
Cuestiones relacionadas