Skip to content

Instantly share code, notes, and snippets.

@tblobaum
Last active December 20, 2021 21:56
Show Gist options
  • Save tblobaum/cba3dd35a41c3c7775c890f0c24476c8 to your computer and use it in GitHub Desktop.
Save tblobaum/cba3dd35a41c3c7775c890f0c24476c8 to your computer and use it in GitHub Desktop.
Calculate which date is x days before/after a date
var MONTHS = {
1: 31,
2: 28,
3: 31,
4: 30,
5: 31,
6: 30,
7: 31,
8: 31,
9: 30,
10: 31,
11: 30,
12: 31
}
var leap = 2020
// input: 6/6/1999
// input: 66
// input: before
// output: 4/1/1999
function get_date_from_days (date, days, direction) {
if (direction === "before") {
get_date_days_before(date, days)
} else if (direciton === "after") {
get_date_days_after(date, days)
} else {
throw new Error('direction must be either before or after')
}
}
function object_from_date_str (date) {
var arr = date.split("/")
return { year: Number(arr[2]), month: Number(arr[0]), day: Number(arr[1]) }
}
function get_date_days_before (date, days) {
var d = object_from_date_str(date)
return calculate_days_before(d, days)
}
function calculate_days_before (d, days) {
var val = loop_calculate_days_before(d, days)
if (val.complete === true) {
return val.d
} else {
return calculate_days_before(val.d, val.days)
}
}
function loop_calculate_days_before (d, days) {
if (d.year % 4 === 0) MONTHS[2] = 29
else MONTHS[2] = 28
if (days === 0) return { d: d, days: days, complete: true }
days = days - 1
if (d.day > 1) {
d.day = d.day -1
return { d:d, days: days, complete: false }
} else {
// day of month is 1
if (d.month > 1) {
d.month = d.month - 1
d.day = MONTHS[d.month]
return { d:d, days: days, complete: false }
} else {
// month is 1
d.year = d.year - 1
d.month = 12
d.day = MONTHS[d.month]
return { d:d, days: days, complete: false }
}
}
}
function get_date_days_after (date, days) {
var d = object_from_date_str(date)
return calculate_days_after(d, days)
}
function calculate_days_after (d, days) {
var val = loop_calculate_days_after(d, days)
if (val.complete === true) {
return val.d
} else {
return calculate_days_after(val.d, val.days)
}
}
function loop_calculate_days_after (d, days) {
if (d.year % 4 === 0) MONTHS[2] = 29
else MONTHS[2] = 28
if (days === 0) return { d: d, days: days, complete: true }
days = days - 1
if (d.day < MONTHS[d.month]) {
d.day = d.day + 1
return { d:d, days: days, complete: false }
} else {
// day of month is at the end
if (d.month < 12) {
d.month = d.month + 1
d.day = 1
return { d:d, days: days, complete: false }
} else {
// month is 12
d.year = d.year + 1
d.month = 1
d.day = 1
return { d:d, days: days, complete: false }
}
}
}
get_date_days_before("6/6/1999", 66)
get_date_days_after("6/6/1999", 66)
get_date_days_before("6/6/1999", 666)
get_date_days_after("6/6/1999", 666)
var days_arr = [
11,
22,
33,
44,
55,
66,
77,
88,
99,
111,
222,
333,
444,
555,
666,
777,
888,
999,
420,
707,
712,
717,
725,
1111,
2222,
3333,
4444,
5555,
6666,
7777,
8888,
9999
]
function calculate_all (date) {
days_arr.forEach(function (day) {
console.log(day, "before", get_date_days_before(date, day))
console.log(day, "after", get_date_days_after(date, day))
})
}
calculate_all("9/11/2001")
calculate_all("6/6/2020")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment