Skip to content

Instantly share code, notes, and snippets.

@kamikat
Created November 13, 2018 08:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kamikat/08f072acadd56561f0738ac78cea9c5f to your computer and use it in GitHub Desktop.
Save kamikat/08f072acadd56561f0738ac78cea9c5f to your computer and use it in GitHub Desktop.
Native JavaScript date manipulation, inspired by https://github.com/you-dont-need/You-Dont-Need-Momentjs.
const startOf = {
d: (d) => {
d.setHours(0, 0, 0, 0);
return d;
},
w: (d) => {
d.setDate(d.getDate() - (d.getDay() || 7) + 1);
d.setHours(0, 0, 0, 0);
return d;
},
m: (d) => {
d.setDate(1);
d.setHours(0, 0, 0, 0);
return d;
},
y: (d) => {
d.setMonth(0);
d.setDate(1);
d.setHours(0, 0, 0, 0);
return d;
},
};
const endOf = {
d: (d) => {
d.setHours(23, 59, 59, 999);
return d;
},
w: (d) => {
d.setDate(d.getDate() - (d.getDay() || 7) + 7);
d.setHours(23, 59, 59, 999);
return d;
},
m: (d) => {
d.setMonth(d.getMonth() + 1);
d.setDate(0);
d.setHours(23, 59, 59, 999);
return d;
},
y: (d) => {
d.setFullYear(d.getFullYear() + 1);
d.setMonth(0);
d.setDate(0);
d.setHours(23, 59, 59, 999);
return d;
},
};
const offsetBy = {
d: (d, n) => {
d.setDate(d.getDate() + n);
return d;
},
w: (d, n) => {
d.setDate(d.getDate() + n * 7);
return d;
},
m: (d, n) => {
const mm = d.getMonth() + n;
d.setMonth(mm);
if (d.getMonth() !== (mm - 12 * Math.floor(mm / 12))) {
d.setDate(0);
}
return d;
},
y: (d, n) => {
d.setFullYear(d.getFullYear() + n);
return d;
},
};
module.exports = { startOf, endOf, offsetBy };
const { same } = require('tap');
const { startOf, endOf, offsetBy } = require('./date');
same(startOf['d'](new Date('2018-11-13 09:30:10')).toLocaleString(), '2018-11-13 00:00:00');
same(startOf['w'](new Date('2018-11-13 09:30:10')).toLocaleString(), '2018-11-12 00:00:00');
same(startOf['m'](new Date('2018-11-13 09:30:10')).toLocaleString(), '2018-11-1 00:00:00');
same(startOf['y'](new Date('2018-11-13 09:30:10')).toLocaleString(), '2018-1-1 00:00:00');
same(startOf['d'](new Date('2018-11-13 00:00:00')).toLocaleString(), '2018-11-13 00:00:00');
same(startOf['w'](new Date('2018-11-12 00:00:00')).toLocaleString(), '2018-11-12 00:00:00');
same(startOf['m'](new Date('2018-11-1 00:00:00')).toLocaleString(), '2018-11-1 00:00:00');
same(startOf['y'](new Date('2018-1-1 00:00:00')).toLocaleString(), '2018-1-1 00:00:00');
same(endOf['d'](new Date('2018-11-13 09:30:10')).toLocaleString(), '2018-11-13 23:59:59');
same(endOf['w'](new Date('2018-11-13 09:30:10')).toLocaleString(), '2018-11-18 23:59:59');
same(endOf['m'](new Date('2018-11-13 09:30:10')).toLocaleString(), '2018-11-30 23:59:59');
same(endOf['y'](new Date('2018-11-13 09:30:10')).toLocaleString(), '2018-12-31 23:59:59');
same(endOf['d'](new Date('2018-11-13 23:59:59')).toLocaleString(), '2018-11-13 23:59:59');
same(endOf['w'](new Date('2018-11-18 23:59:59')).toLocaleString(), '2018-11-18 23:59:59');
same(endOf['m'](new Date('2018-11-30 23:59:59')).toLocaleString(), '2018-11-30 23:59:59');
same(endOf['y'](new Date('2018-12-31 23:59:59')).toLocaleString(), '2018-12-31 23:59:59');
same(startOf['d'](new Date('2018-11-13 23:59:59')).toLocaleString(), '2018-11-13 00:00:00');
same(startOf['w'](new Date('2018-11-18 23:59:59')).toLocaleString(), '2018-11-12 00:00:00');
same(startOf['m'](new Date('2018-11-30 23:59:59')).toLocaleString(), '2018-11-1 00:00:00');
same(startOf['y'](new Date('2018-12-31 23:59:59')).toLocaleString(), '2018-1-1 00:00:00');
same(endOf['d'](new Date('2018-11-13 00:00:00')).toLocaleString(), '2018-11-13 23:59:59');
same(endOf['w'](new Date('2018-11-12 00:00:00')).toLocaleString(), '2018-11-18 23:59:59');
same(endOf['m'](new Date('2018-11-1 00:00:00')).toLocaleString(), '2018-11-30 23:59:59');
same(endOf['y'](new Date('2018-1-1 00:00:00')).toLocaleString(), '2018-12-31 23:59:59');
same(startOf['d'](new Date('2018-11-13 09:30:10')).toISOString(), '2018-11-12T16:00:00.000Z');
same(startOf['w'](new Date('2018-11-13 09:30:10')).toISOString(), '2018-11-11T16:00:00.000Z');
same(startOf['m'](new Date('2018-11-13 09:30:10')).toISOString(), '2018-10-31T16:00:00.000Z');
same(startOf['y'](new Date('2018-11-13 09:30:10')).toISOString(), '2017-12-31T16:00:00.000Z');
same(endOf['d'](new Date('2018-11-13 09:30:10')).toISOString(), '2018-11-13T15:59:59.999Z');
same(endOf['w'](new Date('2018-11-13 09:30:10')).toISOString(), '2018-11-18T15:59:59.999Z');
same(endOf['m'](new Date('2018-11-13 09:30:10')).toISOString(), '2018-11-30T15:59:59.999Z');
same(endOf['y'](new Date('2018-11-13 09:30:10')).toISOString(), '2018-12-31T15:59:59.999Z');
same(offsetBy['d'](new Date('2018-11-13 09:30:10'), 0).toLocaleString(), '2018-11-13 09:30:10');
same(offsetBy['w'](new Date('2018-11-13 09:30:10'), 0).toLocaleString(), '2018-11-13 09:30:10');
same(offsetBy['m'](new Date('2018-11-13 09:30:10'), 0).toLocaleString(), '2018-11-13 09:30:10');
same(offsetBy['y'](new Date('2018-11-13 09:30:10'), 0).toLocaleString(), '2018-11-13 09:30:10');
same(offsetBy['d'](new Date('2018-11-13 09:30:10'), 1).toLocaleString(), '2018-11-14 09:30:10');
same(offsetBy['w'](new Date('2018-11-13 09:30:10'), 1).toLocaleString(), '2018-11-20 09:30:10');
same(offsetBy['m'](new Date('2018-11-13 09:30:10'), 1).toLocaleString(), '2018-12-13 09:30:10');
same(offsetBy['y'](new Date('2018-11-13 09:30:10'), 1).toLocaleString(), '2019-11-13 09:30:10');
same(offsetBy['d'](new Date('2018-11-13 09:30:10'), -1).toLocaleString(), '2018-11-12 09:30:10');
same(offsetBy['w'](new Date('2018-11-13 09:30:10'), -1).toLocaleString(), '2018-11-6 09:30:10');
same(offsetBy['m'](new Date('2018-11-13 09:30:10'), -1).toLocaleString(), '2018-10-13 09:30:10');
same(offsetBy['y'](new Date('2018-11-13 09:30:10'), -1).toLocaleString(), '2017-11-13 09:30:10');
same(offsetBy['d'](new Date('2018-11-30 09:30:10'), 1).toLocaleString(), '2018-12-1 09:30:10');
same(offsetBy['d'](new Date('2018-12-1 09:30:10'), -1).toLocaleString(), '2018-11-30 09:30:10');
same(offsetBy['w'](new Date('2018-11-27 09:30:10'), 1).toLocaleString(), '2018-12-4 09:30:10');
same(offsetBy['w'](new Date('2018-12-4 09:30:10'), -1).toLocaleString(), '2018-11-27 09:30:10');
same(offsetBy['d'](new Date('2018-12-31 09:30:10'), 1).toLocaleString(), '2019-1-1 09:30:10');
same(offsetBy['d'](new Date('2019-1-1 09:30:10'), -1).toLocaleString(), '2018-12-31 09:30:10');
same(offsetBy['w'](new Date('2018-12-31 09:30:10'), 1).toLocaleString(), '2019-1-7 09:30:10');
same(offsetBy['w'](new Date('2019-1-7 09:30:10'), -1).toLocaleString(), '2018-12-31 09:30:10');
same(offsetBy['m'](new Date('2018-12-13 09:30:10'), 1).toLocaleString(), '2019-1-13 09:30:10');
same(offsetBy['m'](new Date('2019-1-13 09:30:10'), -1).toLocaleString(), '2018-12-13 09:30:10');
same(offsetBy['d'](new Date('2018-2-28 09:30:10'), 1).toLocaleString(), '2018-3-1 09:30:10');
same(offsetBy['d'](new Date('2018-3-1 09:30:10'), -1).toLocaleString(), '2018-2-28 09:30:10');
same(offsetBy['d'](new Date('2020-2-28 09:30:10'), 1).toLocaleString(), '2020-2-29 09:30:10');
same(offsetBy['d'](new Date('2020-2-29 09:30:10'), 1).toLocaleString(), '2020-3-1 09:30:10');
same(offsetBy['d'](new Date('2020-3-1 09:30:10'), -1).toLocaleString(), '2020-2-29 09:30:10');
same(offsetBy['m'](new Date('2018-5-31 09:30:10'), 1).toLocaleString(), '2018-6-30 09:30:10');
same(offsetBy['m'](new Date('2018-5-31 09:30:10'), -1).toLocaleString(), '2018-4-30 09:30:10');
same(offsetBy['m'](new Date('2018-1-31 09:30:10'), 1).toLocaleString(), '2018-2-28 09:30:10');
same(offsetBy['m'](new Date('2020-1-31 09:30:10'), 1).toLocaleString(), '2020-2-29 09:30:10');
same(offsetBy['m'](new Date('2018-3-31 09:30:10'), -1).toLocaleString(), '2018-2-28 09:30:10');
same(offsetBy['m'](new Date('2020-3-31 09:30:10'), -1).toLocaleString(), '2020-2-29 09:30:10');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment