edit doc

Moment Plugin

Moment JS is a popular library for parsing, formatting, and manipulating dates. FullCalendar has a connector package that provides the following functionality:

  • Lets you use moment formatting strings for all date-formatting settings
  • Lets you convert native Date objects emitted from the API into moment objects that match the calendar’s time zone and locale
  • Lets you convert Duration objects emitted from the API into moment durations objects

Usage with NPM

First, install the @fullcalendar/moment package along with any other packages you plan to use:

npm install --save \
  @fullcalendar/moment \
  @fullcalendar/core \
  @fullcalendar/daygrid

Then, create a new calendar and pass in the plugins:

import { Calendar } from '@fullcalendar/core'
import momentPlugin from '@fullcalendar/moment'
import dayGridPlugin from '@fullcalendar/daygrid'

let calendarEl = document.getElementById('calendar')
let calendar = new Calendar(calendarEl, {
  plugins: [ momentPlugin, dayGridPlugin ],
  titleFormat: 'MMMM D, YYYY' // you can now use moment format strings!
});

calendar.render()

Usage with Webpack

When used with Webpack, whenever the moment package is imported into your project, it imports ALL locales. This is a known issue with moment. It applies to @fullcalendar/moment as well. Luckily there is a workaround. Use moment-locales-webpack-plugin to strip away these unused locales.

View an example moment project

Usage with Script Tags

You can also configure the moment plugin with script tags. This example leverages CDN links:

<!-- moment lib -->
<script src='https://cdn.jsdelivr.net/npm/moment@2.27.0/min/moment.min.js'></script>

<!-- fullcalendar bundle -->
<script src='https://cdn.jsdelivr.net/npm/fullcalendar@6.1.11/index.global.min.js'></script>

<!-- the moment-to-fullcalendar connector. must go AFTER the moment lib -->
<script src='https://cdn.jsdelivr.net/npm/@fullcalendar/moment@6.1.11/index.global.min.js'></script>

<script>
  var calendarEl = document.getElementById('calendar')
  var calendar = new FullCalendar.Calendar(calendarEl, {
    titleFormat: 'MMMM D, YYYY' // you can now use moment format strings!
  })

  calendar.render()
</script>

Formatting

The plugin allows you to specify moment formatting strings wherever a date formatting input is expected:

var calendar = new FullCalendar.Calendar(calendarEl, {
  titleFormat: 'MMMM D, YYYY' // you can now use moment format strings!
})

If you want to format a date range, you can group related date parts with curly brackets:

var calendar = new FullCalendar.Calendar(calendarEl, {
  titleFormat: '{MMMM {D}}, YYYY'
  // could produce "January 5 - 7, 2018"
  // could produce "January 5 - February 31, 2018"
  // could produce "January 5, 2018 - June 9, 2019"
});

Moment Objects

Using the provided utility functions, you can convert dates and durations supplied by FullCalendar’s API into moment objects and durations:

import { Calendar } from '@fullcalendar/core';
import { toMoment, toMomentDuration } from '@fullcalendar/moment';
...
let calendar = new Calendar(calendarEl, {

  dateClick: function(arg) {
    let m = toMoment(arg.date, calendar); // calendar is required
    console.log('clicked on ' + m.format());
  },

  eventDrop: function(arg) {
    let d = toMomentDuration(arg.delta);
    console.log('event moved ' + d.humanize());
  }
});
...

When using script tags, these utility functions are available as FullCalendarMoment.toMoment and FullCalendarMoment.toMomentDuration.

Usage with TypeScript

If you’re using the @fullcalendar/moment plugin in a TypeScript project, you’ll need to configure your tsconfig.json to have the allowSyntheticDefaultImports compiler option set to true:

{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true
  }
}

This is necessary due to how the moment package exposes itself in an ES6 environment.

View an example moment+typescript project