Skip to content

Instantly share code, notes, and snippets.

@krcrawford
Created March 6, 2019 17:23
Show Gist options
  • Save krcrawford/b7574cc0b3450db8bd81e8e19b936f25 to your computer and use it in GitHub Desktop.
Save krcrawford/b7574cc0b3450db8bd81e8e19b936f25 to your computer and use it in GitHub Desktop.
Javascript Homework #5
const timeAdder = (value1, label1, value2, label2) => {
if (typeof value1 !== "number" || typeof value2 !== "number") {
console.log("Values must be numbers");
return false; // must be numbers
}
if (/\./.test(value1) || /\./.test(value2)) {
console.log("Values must be integers");
return false; // must be integers
}
if (value1 < 0 || value2 < 0) {
console.log("Values must be positive");
return false; // must be positive
}
const units = ["second", "seconds", "minute", "minutes", "hour", "hours", "day", "days"];
if (typeof label1 !== "string" || typeof label2 !== "string") {
console.log("Only string types are allowed for labels")
return false; // only strings allowed
}
if (units.indexOf(label1) === -1 || units.indexOf(label2) === -1) {
console.log("Only the specific set of strings is allowed for labels")
return false; // only specific labels allowed
}
if ((value1 === 1 && /s$/.test(label1)) ||
(value2 === 1 && /s$/.test(label2))) {
console.log("Check your labels for proper pluralization when necessary, i.e. use 1 hour instead of 1 hours, or 25 minutes insetad of 25 minute");
return false; // make sure pluralization is in place where required
}
const i1 = units.indexOf(label1);
const i2 = units.indexOf(label2);
let args = [value1, label1, value2, label2];
if (i1 > i2) {
// smaller units first
args = [value2, label2, value1, label1];
}
switch (args[1]) {
case "minute":
case "minutes":
args[0] *= 60;
break;
case "hour":
case "hours":
args[0] *= 3600;
break;
case "day":
case "days":
args[0] *= 86400;
break;
}
switch (args[3]) {
case "minute":
case "minutes":
args[2] *= 60;
break;
case "hour":
case "hours":
args[2] *= 3600;
break;
case "day":
case "days":
args[2] *= 86400;
break;
}
args[1] = args[3] = "seconds";
let totalSeconds = args[0] + args[2];
let numSeconds = totalSeconds;
let numDays = 0, numHours = 0, numMinutes = 0;
if (numSeconds >= 86400) {
numDays = Math.floor(numSeconds / 86400);
}
numSeconds -= (numDays * 86400);
if (numSeconds >= 3600) {
numHours = Math.floor(numSeconds / 3600);
}
numSeconds -= (numHours * 3600);
if (numSeconds >= 60) {
numMinutes = Math.floor(numSeconds / 60);
}
numSeconds -= (numMinutes * 60);
let unit = "seconds";
if (numSeconds === 0) {
unit = "minutes";
}
if (numSeconds === 0 && numMinutes === 0) {
unit = "hours";
}
if (numSeconds === 0 && numMinutes === 0 && numHours === 0) {
unit = "days";
}
let res = [totalSeconds, unit];
switch (unit) {
case "days":
res[0] = numDays;
break;
case "hours":
res[0] = numHours + (numDays * 24);
break;
case "minutes":
res[0] = numMinutes + (numHours * 60) + (numDays * 24);
break;
}
if (res[0] === 1) {
res[1] = res[1].substring(0, res[1].length - 1);
}
console.log("Days: " + numDays + ", Hours: " + numHours + ", Minutes: " + numMinutes + ", Seconds: " + numSeconds);
console.log(res);
return res;
};
timeAdder(2, "hours", 22, "hours"); // <-- [1, "day"]
timeAdder(6, "hours", 20, "hours"); // <-- [26, "hours"]
timeAdder(60, "minutes", 1, "hour"); // <-- [2, "hours"]
timeAdder(10, "minutes", 50, "minutes"); // <-- [1, "hour"]
timeAdder(50, "seconds", 10, "minutes"); // <-- [650, "seconds"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment