mout
Version:
Modular Utilities
53 lines (47 loc) • 1.4 kB
text/typescript
import clone from '../lang/clone';
/**
* get a new Date object representing start of period
*/
function startOf(date, period) {
date = clone(date);
// intentionally removed "break" from switch since start of
// month/year/etc should also reset the following periods
switch (period) {
case 'year':
date.setMonth(0);
/* falls through */
case 'month':
date.setDate(1);
/* falls through */
case 'week':
case 'day':
date.setHours(0);
/* falls through */
case 'hour':
date.setMinutes(0);
/* falls through */
case 'minute':
date.setSeconds(0);
/* falls through */
case 'second':
date.setMilliseconds(0);
break;
default:
throw new Error(`"${period}" is not a valid period`);
}
// week is the only case that should reset the weekDay and maybe even
// overflow to previous month
if (period === 'week') {
const weekDay = date.getDay();
const baseDate = date.getDate();
if (weekDay) {
if (weekDay >= baseDate) {
// start of the week is on previous month
date.setDate(0);
}
date.setDate(date.getDate() - date.getDay());
}
}
return date;
}
export default startOf;