2011-10-18 8 views
7

Załóżmy, że mam liczbę reprezentującą minuty przekazane od czasu rozpoczęcia do teraz.Konwertuje minuty na dni, tygodnie, miesiące i lata.

Chcę utworzyć funkcję, która zwraca lata, miesiące, tygodnie i dni odpowiadające minutom, które przechodzę do tej funkcji.

Oto przykład:

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 
} 

Jaki jest najlepszy sposób, aby osiągnąć ten wynik?

+1

Czy używasz daty odniesienia przez 0 minut? Może być potrzebny do obliczenia prawidłowej długości miesiąca. – biziclop

+0

Tak, odniesienie dla 0 minut jest bieżącą datą. Zatem 'var minutes = 2;' oznacza 2 minuty od teraz. – antonjs

+0

Będziesz musiał być bardziej precyzyjny, aby uzyskać przyzwoitą odpowiedź. Co masz na myśli mówiąc "miesiące, tygodnie i dni?" Dzisiaj jest 18 października. Ile miesięcy, tygodni i dni upływa od 29 listopada do 35 listopada? Ile dni jest dzisiaj między 23:59 dzisiaj a 12:01 jutro? Zero? Jeden? –

Odpowiedz

10

Może tak ?

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

Trzeba użyć podział i moduł:

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

Dlaczego jest int division, a nie float? – jgritty

+0

W javascript może to zrobić w unosić. Więc możesz po prostu otoczyć go 'Math.floor (...)', aby je zaokrąglić. – jtfairbank

5

Zrobiłem to tak, bo nawet nie wiedzą, że nie był to operator modulo w 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

budynku off thg435's response above, utworzonego funkcję, która przekształca sekund do kilku dni, godziny, minuty i sekundy:

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; 

} 

I dodaje także kilka miejsc w rezultacie dać przecinkami pewną przestrzeń . Wyjście wygląda następująco:

1 day, 3 hours, 52 minutes, 7 seconds. 
Powiązane problemy