Last active
December 20, 2021 21:56
-
-
Save tblobaum/cba3dd35a41c3c7775c890f0c24476c8 to your computer and use it in GitHub Desktop.
Calculate which date is x days before/after a date
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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