Skip to content

Calendar Generation ​

Building calendars and datepickers is a common requirement. The getCalendarDays() static method provides all the data you need to render a complete monthly calendar.

Basic Calendar Data ​

Get Calendar Days for a Month ​

php
use NepaliDateLibrary\NepaliDate;

$calendar = NepaliDate::getCalendarDays(2082, 9); // Magh 2082

print_r($calendar);
// [
//   'prevRemainingDays' => 3,
//   'prevMonth' => ['year' => 2082, 'month' => 8, 'days' => [28, 29, 30]],
//   'currentMonth' => ['year' => 2082, 'month' => 9, 'days' => [1, 2, 3, ..., 29]],
//   'nextMonth' => ['year' => 2082, 'month' => 10, 'days' => [1, 2, 3, 4, 5]],
//   'remainingDays' => 5,
// ]

Understanding the Output ​

KeyDescription
'prevRemainingDays'Number of days from previous month to fill the first week
'prevMonth'Previous month's trailing days
'currentMonth'Current month's complete day array
'nextMonth'Next month's leading days
'remainingDays'Number of days from next month needed to complete the grid

Building a Calendar Grid ​

Plain PHP Calendar Grid ​

php
use NepaliDateLibrary\NepaliDate;

/**
 * @return array<int, array{day: int, month: 'prev'|'current'|'next', year: int, monthIndex: int, isToday: bool}>
 */
function generateCalendarGrid(int $year, int $month): array
{
    $calendar = NepaliDate::getCalendarDays($year, $month);
    $today = new NepaliDate();

    $days = [];

    foreach ($calendar['prevMonth']['days'] as $day) {
        $days[] = [
            'day' => $day,
            'month' => 'prev',
            'year' => $calendar['prevMonth']['year'],
            'monthIndex' => $calendar['prevMonth']['month'],
            'isToday' => false,
        ];
    }

    foreach ($calendar['currentMonth']['days'] as $day) {
        $days[] = [
            'day' => $day,
            'month' => 'current',
            'year' => $calendar['currentMonth']['year'],
            'monthIndex' => $calendar['currentMonth']['month'],
            'isToday' => $today->getYear() === $year
                && $today->getMonth() === $month
                && $today->getDate() === $day,
        ];
    }

    foreach ($calendar['nextMonth']['days'] as $day) {
        $days[] = [
            'day' => $day,
            'month' => 'next',
            'year' => $calendar['nextMonth']['year'],
            'monthIndex' => $calendar['nextMonth']['month'],
            'isToday' => false,
        ];
    }

    return $days;
}

// Usage
$days = generateCalendarGrid(2082, 9);
echo count($days), PHP_EOL; // 35 or 42 (5 or 6 weeks)

Laravel Blade Calendar View ​

Controller:

php
use NepaliDateLibrary\NepaliDate;

class CalendarController
{
    public function show(int $year, int $month)
    {
        $calendar = NepaliDate::getCalendarDays($year, $month);
        $current = new NepaliDate($year, $month, 1);

        return view('calendar.show', [
            'calendar' => $calendar,
            'title' => $current->format('MMMM YYYY'),
            'weekdays' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
        ]);
    }
}

resources/views/calendar/show.blade.php:

blade
<div class="calendar">
    <div class="header">{{ $title }}</div>

    <div class="weekdays">
        @foreach ($weekdays as $day)
            <span class="weekday">{{ $day }}</span>
        @endforeach
    </div>

    <div class="days">
        @foreach ($calendar['prevMonth']['days'] as $day)
            <span class="day prev-month">{{ $day }}</span>
        @endforeach

        @foreach ($calendar['currentMonth']['days'] as $day)
            <span class="day current-month">{{ $day }}</span>
        @endforeach

        @foreach ($calendar['nextMonth']['days'] as $day)
            <span class="day next-month">{{ $day }}</span>
        @endforeach
    </div>
</div>
php
use NepaliDateLibrary\NepaliDate;

$currentMonth = new NepaliDate(2082, 9, 1);

$prevMonth = $currentMonth->addMonths(-1);
$nextMonth = $currentMonth->addMonths(1);

$prevCalendar = NepaliDate::getCalendarDays($prevMonth->getYear(), $prevMonth->getMonth());
$nextCalendar = NepaliDate::getCalendarDays($nextMonth->getYear(), $nextMonth->getMonth());

Nepali Numerals in Calendar ​

Calendar with Nepali Display ​

php
use NepaliDateLibrary\Helper\Constants;
use NepaliDateLibrary\NepaliDate;

function toNepaliNumber(int $num): string
{
    $digits = str_split((string) $num);
    return implode('', array_map(fn ($d) => Constants::$NUMBER_NP[(int) $d], $digits));
}

function renderNepaliCalendar(int $year, int $month): string
{
    $calendar = NepaliDate::getCalendarDays($year, $month);
    $currentDate = new NepaliDate($year, $month, 1);

    $html = '<div class="nepali-calendar">';
    $html .= '<div class="header">' . $currentDate->format('mmmm yyyy') . '</div>';

    $html .= '<div class="weekdays">';
    foreach (Constants::$WEEK_SHORT_NP as $day) {
        $html .= "<span>{$day}</span>";
    }
    $html .= '</div>';

    $html .= '<div class="days">';

    foreach ($calendar['prevMonth']['days'] as $day) {
        $html .= '<span class="prev">' . toNepaliNumber($day) . '</span>';
    }
    foreach ($calendar['currentMonth']['days'] as $day) {
        $html .= '<span class="current">' . toNepaliNumber($day) . '</span>';
    }
    foreach ($calendar['nextMonth']['days'] as $day) {
        $html .= '<span class="next">' . toNepaliNumber($day) . '</span>';
    }

    $html .= '</div></div>';

    return $html;
}

Week Information ​

Get Week Number ​

php
use NepaliDateLibrary\NepaliDate;

function getWeekNumber(NepaliDate $date): int
{
    $startOfYear = $date->startOfYear();
    $daysDiff = $date->diff($startOfYear, 'day');
    $startDayOfWeek = $startOfYear->getDay();

    return (int) ceil(($daysDiff + $startDayOfWeek + 1) / 7);
}

$date = new NepaliDate(2082, 9, 15);
echo "Week " . getWeekNumber($date), PHP_EOL; // Week 42

Get Weeks in Month ​

php
use NepaliDateLibrary\NepaliDate;

$date = new NepaliDate(2082, 9, 1);
$weeks = $date->getWeeksInMonth();
echo "This month has {$weeks} weeks", PHP_EOL; // 5 or 6

Calendar Styling Tips ​

css
.calendar {
  --day-size: 40px;
  --gap: 4px;
  width: calc(var(--day-size) * 7 + var(--gap) * 6);
}

.days {
  display: grid;
  grid-template-columns: repeat(7, var(--day-size));
  gap: var(--gap);
}

.day {
  width: var(--day-size);
  height: var(--day-size);
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  cursor: pointer;
}

.day.prev-month,
.day.next-month {
  opacity: 0.4;
}

.day.today {
  background: #3b82f6;
  color: white;
}

.day:hover {
  background: #e5e7eb;
}

Released under the MIT License.