antonjs
antonjs

Reputation: 14328

Converts minutes into days, week, months and years

Let's suppose I have a number which represents the minutes passed from the start time to now.

I wan to create a function which returns the years, months, week and days corresponding to the minutes I am passing to that function.

Here an example:

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
}

What is the best way to achieve the result?

Upvotes: 9

Views: 10984

Answers (5)

MUGABA
MUGABA

Reputation: 891

Hey I have implemented some code that would some work for someone

const MINS_PER_YEAR = 24 * 365 * 60,
  MINS_PER_MONTH = 24 * 30 * 60,
  MINS_PER_WEEK = 24 * 7 * 60,
  MINS_PER_DAY = 24 * 60;

const hours = (minutes) => {
  const hour = Math.floor(minutes / 60);
  const remainingMinutes = minutes - hour * 60;
  return `${hour} hours ${remainingMinutes} minutes`;
};

const days = (minutes) => {
  const days = Math.floor(minutes / (24 * 60));
  const remainingMinutes = minutes - days * 24 * 60;
  const hour = hours(remainingMinutes);

  return `${days} days ${hour}`;
};

const weeks = (minutes) => {
  const weeks = Math.floor(minutes / (24 * 7 * 60));
  const remainingMinutes = minutes - weeks * (24 * 7 * 60);
  if (remainingMinutes <= MINS_PER_DAY) return `${weeks} weeks ${hours(remainingMinutes)}`;
  else return `${weeks} weeks ${days(remainingMinutes)}`;
};

const months = (minutes) => {
  const months = Math.floor(minutes / MINS_PER_MONTH);
  const remainingMinutes = minutes - months * MINS_PER_MONTH;
  if (remainingMinutes <= 60) return `${months} months ${hours(remainingMinutes)}`;
  else if (remainingMinutes <= MINS_PER_DAY) return `${months} months ${days(remainingMinutes)}`;
  else return `${months} months ${weeks(remainingMinutes)}`;
};

export const convertMinutes = (minutes) => {
  if (minutes <= 60) return `${minutes} minutes`;
  else if (minutes <= MINS_PER_DAY) return hours(minutes);
  else if (minutes <= MINS_PER_WEEK) return days(minutes);
  else if (minutes <= MINS_PER_MONTH) return weeks(minutes);
  else return months(minutes);
};

Upvotes: 0

skybondsor
skybondsor

Reputation: 747

Building off of thg435's response above, I created a function that converts seconds to days, hours, minutes, and seconds:

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 also added some spaces to the result to give the commas some room. Output looks like:

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

Upvotes: 8

georg
georg

Reputation: 215039

Maybe like this?

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]

}

Upvotes: 13

jgritty
jgritty

Reputation: 11935

I did it like this, because I didn't even know there was a modulo operator in 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
}

Upvotes: 5

jtfairbank
jtfairbank

Reputation: 2307

You need to use division and modulus:

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
}

Upvotes: 4

Related Questions