datesInMonthGrid method

List<DateTime> datesInMonthGrid (DateTime month, { bool startOnMonday: false })

Returns a grid-like list of DateTimes in a given month, with 35 items.

startOnMonday will start the grid on Monday instead of Sunday.

Implementation

static List<DateTime> datesInMonthGrid(
  DateTime month, {
  bool startOnMonday = false,
}) {
  int _getWeekdayNumber(DayOfWeek weekday) {
    return DayOfWeek.values.indexOf(weekday) + 1;
  }

  int _getDaysBefore(DateTime firstDay, DayOfWeek startingWeekDay) {
    return (firstDay.weekday + 7 - _getWeekdayNumber(startingWeekDay)) % 7;
  }

  int _getDaysAfter(DateTime lastDay, DayOfWeek startingWeekDay) {
    final invertedStartingWeekday = 8 - _getWeekdayNumber(startingWeekDay);

    var daysAfter = 7 - ((lastDay.weekday + invertedStartingWeekday) % 7) + 1;
    if (daysAfter == 8) {
      daysAfter = 1;
    }

    return daysAfter;
  }

  final first = firstDayOfMonth(month);
  final daysBefore = _getDaysBefore(
      first, startOnMonday ? DayOfWeek.monday : DayOfWeek.sunday);
  final firstToDisplay = first.subtract(Duration(days: daysBefore));

  final last = lastDayOfMonth(month);
  final daysAfter = _getDaysAfter(
      last, startOnMonday ? DayOfWeek.monday : DayOfWeek.sunday);

  final lastToDisplay = last.add(Duration(days: daysAfter));
  return daysInRange(firstToDisplay, lastToDisplay).toList();
}