vue-moment
Handy Moment.js filters for your Vue.js project.
Installation
Install via NPM...
$ npm install vue-moment
...and require the plugin like so:
Vue;
Usage
Simply set moment
as the filtering function and you're good to go. At least one argument is expected, which the filter assumes to be a format
string if the argument doesn't match any of the other filtering methods.
{{ someDate | moment("dddd, MMMM Do YYYY") }}<!-- or create a new date from 'now' -->{{ new Date() | moment("dddd, MMMM Do YYYY") }}
Passing Your Date
Moment.js expects your input to be either: a valid ISO 8601 formatted string (see http://momentjs.com/docs/#/parsing/string/), a valid Date
object, a Unix timestamp (in seconds or milliseconds, passed as a Number), or a date string with an accompanying format pattern (i.e. when you know the format of the date input). For the latter, vue-moment
allows you to pass your date and format pattern(s) as an array, like such:
{{ [ someDate, "MM.DD.YY" ] | moment("dddd, MMMM Do YYYY") }}<!-- or when you want to parse against more than one pattern -->{{ [ someDate, ["MM.DD.YY", "MM-DD-YY", "MM-DD-YYYY"] ] | moment("dddd, MMMM Do YYYY") }}
As of 3.0.0, passing an empty or invalid input will no longer initiate moment with a new Date
object fallback.
Filtering Methods
format (default)
This is the default filtering option. Formats the date against a string of tokens. See http://momentjs.com/docs/#/displaying/format/ for a list of tokens and examples.
Default
{{ someDate | moment("YYYY") }}<!-- e.g. "2010" -->{{ someDate | moment("ddd, hA") }}<!-- e.g. "Sun, 3PM" -->{{ someDate | moment("dddd, MMMM Do YYYY, h:mm:ss a") }}<!-- e.g. "Sunday, February 14th 2010, 3:25:50 pm" -->
For more information about moment#format
, check out http://momentjs.com/docs/#/displaying/format/.
from
Display a Moment in relative time, either from now or from a specified date.
Default (calculates from current time)
{{ someDate | moment("from", "now") }}<!-- or shorthanded -->{{ someDate | moment("from") }}
With a reference time given
{{ someDate | moment("from", "Jan. 11th, 1985") }}
With suffix hidden (e.g. '4 days ago' -> '4 days')
{{ someDate | moment("from", "now", true) }}<!-- or -->{{ someDate | moment("from", true) }}<!-- or with a reference time -->{{ someDate | moment("from", "Jan. 11th, 2000", true) }}
For more information about moment#fromNow
and moment#from
, check out http://momentjs.com/docs/#/displaying/fromnow/ and http://momentjs.com/docs/#/displaying/from/.
calendar
Formats a date with different strings depending on how close to a certain date (today by default) the date is. You can also pass a reference date and options.
Default (calculates from current time)
{{ someDate | moment("calendar") }}<!-- e.g. "Last Monday 2:30 AM" -->
With a reference time given
{{ someDate | moment("calendar", "July 10 2011") }}<!-- e.g. "7/10/2011" -->
With options
{{ new Date() | moment('add', '6 days', 'calendar', null, { nextWeek: '[Happens in a week]' }) }}<!-- "Happens in a week" -->
For more information about moment#calendar
, check out http://momentjs.com/docs/#/displaying/calendar-time/.
add
Mutates the original Moment by adding time.
{{ someDate | moment("add", "7 days") }}<!-- or with multiple keys -->{{ someDate | moment("add", "1 year, 3 months, 30 weeks, 10 days") }}
For more information about moment#add
, check out http://momentjs.com/docs/#/manipulating/add/.
subtract
Works the same as add
, but mutates the original moment by subtracting time.
{{ someDate | moment("subtract", "3 hours") }}
For more information about moment#subtract
, check out http://momentjs.com/docs/#/manipulating/subtract/.
timezone
Convert the date to a certain timezone
{{ date | moment('timezone', 'America/Los_Angeles', 'LLLL ss')}}
To use this filter you will need to pass moment-timezone
through to the plugin
// main.js Vue
For more information about moment#timezone
, check out https://momentjs.com/timezone/docs/#/using-timezones/converting-to-zone/.
Chaining
There's some built-in (and not thoroughly tested) support for chaining, like so:
{{ someDate | moment("add", "2 years, 8 days", "subtract", "3 hours", "ddd, hA") }}
This would add 2 years and 8 months to the date, then subtract 3 hours, then format the resulting date.
Durations
vue-moment
also provides a duration
filter that leverages Moment's ability to parse, manipulate and display durations of time. Durations should be passed as either: a String of a valid ISO 8601 formatted duration, a Number of milliseconds, an Array containing a number and unit of measurement (for passing a number other than milliseconds), or an Object of values (for when multiple different units of measurement are needed).
{{ 3600000 | duration('humanize') }}<!-- "an hour" -->{{ 'PT1800S' | duration('humanize') }}<!-- "30 minutes" -->{{ [35, 'days'] | duration('humanize', true) }}<!-- "in a month" -->
This filter is purely a pass-through proxy to moment.duration
methods, so pretty much all the functions outlined in their docs are callable.
{{ [-1, 'minutes'] | duration('humanize', true) }}<!-- "a minute ago" -->{{ { days: 10, months: 1 } | duration('asDays') }}<!-- "40" -->{{ 'P3D' | duration('as', 'hours') }}<!-- "72" -->
For manipulating a duration by either subtraction or addition, first use the relevant filter option, then chain your duration display filter.
{{ [1, 'minutes'] | duration('subtract', 120000) | duration('humanize', true) }}<!-- "a minute ago" -->{{ [-10, 'minutes'] | duration('add', 'PT11M') | duration('humanize', true) }}<!-- "in a minute" -->{{ [2, 'years'] | duration('add', 1, 'year') | duration('humanize') }}<!-- "3 years" -->
duration
is for contextless lengths of time; for comparing 2 dates, use the diff
method rather than hacking around with Moment durations. For more information about moment#duration
, check out https://momentjs.com/docs/#/durations/.
Configuration
vue-moment
should respect any global Moment customizations, including i18n locales. For more info, check out http://momentjs.com/docs/#/customization/.
You can also pass a custom Moment object through with the plugin options. This technique is especially useful for overcoming the browserify locale bug demonstrated in the docs http://momentjs.com/docs/#/use-it/browserify/
const moment = Vue console //es
this.$moment
vue-moment
attaches the momentjs instance to your Vue app as this.$moment
.
This allows you to call the static methods momentjs provides.
If you're using i18n, it allows you to change the locale globally by calling this.$moment.locale(myNewLocale)