Skip to content

Instantly share code, notes, and snippets.

@uonick
Forked from miljan-aleksic/calendar-matrix.js
Created June 18, 2022 21:37
Show Gist options
  • Save uonick/a2eb650fc8a3a7f60d2eccbecf51f1fc to your computer and use it in GitHub Desktop.
Save uonick/a2eb650fc8a3a7f60d2eccbecf51f1fc to your computer and use it in GitHub Desktop.
Calendar Matrix (date-fns, ES6) inspired by https://github.com/bclinkinbeard/calendar-matrix
import getYear from 'date-fns/get_year'
import getMonth from 'date-fns/get_month'
import addDays from 'date-fns/add_days'
import startOfWeek from 'date-fns/start_of_week'
const rows = range(6)
const cols = range(7)
/**
* Returns a two-dimensional array with calendar represented dates
*/
export default function ({ year, month, weekStartsOn } = {
year: getYear(new Date()),
month: getMonth(new Date()),
weekStartsOn: 0
}) {
const matrix = []
const date = new Date(year, month)
let curDate = startOfWeek(date, { weekStartsOn })
rows.forEach(row => {
const week = []
cols.forEach(col => {
week.push(curDate)
curDate = addDays(curDate, 1)
})
matrix.push(week)
})
return matrix
}
/**
* Returns an array range from 0 to n
*/
function range (n) {
return [...Array(n).keys()]
}
@uonick
Copy link
Author

uonick commented Jun 18, 2022

import { eachDayOfInterval, endOfWeek, startOfWeek } from 'date-fns'; // 2.2k (gzipped: 989)

function createCalendar(year: number, month: number): Date[] {
  const start = startOfWeek(new Date(year, month, 1), { weekStartsOn: 1 /* Monday */ });
  const end = endOfWeek(new Date(year, month + 1, 1), { weekStartsOn: 1 /* Monday */ });
  return eachDayOfInterval({ start, end });
}

const calendar = createCalendar(2022, 0 /* January */);

console.log(calendar); // Array<Date> between '27 Dec 2021' and '6 Feb 2022'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment