185

I try to print out date time using like the following in vue-for

{{ moment().format('MMMM Do YYYY, h:mm:ss a') }}

but, it does not appear. It's just a blank. How I can try to use moment in vue?

kissu
  • 40,416
  • 14
  • 65
  • 133
Set Kyar Wa Lar
  • 4,488
  • 4
  • 30
  • 57

14 Answers14

294

With your code, the vue.js is trying to access the moment() method from its scope.

Hence you should use a method like this:

methods: {
  moment: function () {
    return moment();
  }
},

If you want to pass a date to the moment.js, I suggest to use filters:

filters: {
  moment: function (date) {
    return moment(date).format('MMMM Do YYYY, h:mm:ss a');
  }
}

<span>{{ date | moment }}</span>

[demo]

Pantelis Peslis
  • 14,930
  • 5
  • 44
  • 45
187

If your project is a single page application, (eg project created by vue init webpack myproject), I found this way is most intuitive and simple:

In main.js

import moment from 'moment'

Vue.prototype.moment = moment

Then in your template, simply use

<span>{{moment(date).format('YYYY-MM-DD')}}</span>
kissu
  • 40,416
  • 14
  • 65
  • 133
Geng Jiawen
  • 8,904
  • 3
  • 48
  • 37
  • Should also work for other application types aside from SPAs. – iAmcR Jul 21 '20 at 19:23
  • 3
    I really like this method of using Moment. Thanks for sharing! I've just implemented it but with a small change as suggested in the docs, Vue.prototype.$moment = moment. https://vuejs.org/v2/cookbook/adding-instance-properties.html. – Josh Jul 22 '20 at 15:05
  • Simple but you can't have type recognition in VS code. – Alvin Konda Jul 27 '20 at 20:11
  • This worked for me. I'm using Laravel mix with Vue 2.6.12 in my Laravel app. Thanks @Geng Jiawen – Nelson Katale Sep 18 '21 at 08:32
39

In your package.json in the "dependencies" section add moment:

"dependencies": {
  "moment": "^2.15.2",
  ...
}

In the component where you would like to use moment, import it:

<script>
import moment from 'moment'
...

And in the same component add a computed property:

computed: {
  timestamp: function () {
    return moment(this.<model>.attributes['created-at']).format('YYYY-MM-DD [at] hh:mm')
  }
}

And then in the template of this component:

<p>{{ timestamp }}</p>
kissu
  • 40,416
  • 14
  • 65
  • 133
Paweł Gościcki
  • 9,066
  • 5
  • 70
  • 81
  • 3
    It's worth noting that if, instead of using a parameter-less function, you want to use a function like: `date2day: function (date) {return moment(date).format('dddd')}` You cannot use `computed`, and should use `methods` instead. – andresgottlieb Apr 04 '17 at 12:33
21

I made it work with Vue 2.0 in single file component.

npm install moment in folder where you have vue installed

<template>
  <div v-for="meta in order.meta">
    {{ getHumanDate(meta.value.date) }}
  </div>
</template>

<script>
    import moment from 'moment';
    export default {
         methods: {
            getHumanDate : function (date) {
                return moment(date, 'YYYY-MM-DD').format('DD/MM/YYYY');
            }
        }
    }
</script>
kissu
  • 40,416
  • 14
  • 65
  • 133
max
  • 1,579
  • 1
  • 19
  • 34
9

Here is an example using a 3rd party wrapper library for Vue called vue-moment.

In addition to binding Moment instance into Vue's root scope, this library includes moment and duration filters.

This example includes localization and is using ES6 module imports, an official standard, instead of NodeJS's CommonJS module system requires.

import Vue from 'vue';

import moment from 'moment';
import VueMoment from 'vue-moment';

// Load Locales ('en' comes loaded by default)
require('moment/locale/es');

// Choose Locale
moment.locale('es');

Vue.use(VueMoment, { moment });

Now you can use the Moment instance directly in your Vue templates without any additional markup:

<small>Copyright {{ $moment().year() }}</small>

Or the filters:

<span>{{ 3600000 | duration('humanize') }}</span>
<!-- "an hour" -->
<span>{{ [2, 'years'] | duration('add', 1, 'year') | duration('humanize') }}</span>
<!-- "3 years" -->
ux.engineer
  • 10,082
  • 13
  • 67
  • 112
  • 2
    FYI: This answer was flagged as low-quality because of its length and content. You may want to improve it by explaining how this answers OP's question. – oguz ismail May 02 '19 at 07:24
8
// plugins/moment.js

import moment from 'moment';

moment.locale('ru');

export default function install (Vue) {
  Object.defineProperties(Vue.prototype, {
    $moment: {
      get () {
        return moment;
      }
    }
  })
}

// main.js

import moment from './plugins/moment.js';
Vue.use(moment);

// use this.$moment in your components
Pedro
  • 3,511
  • 2
  • 26
  • 31
Rinat Sadykov
  • 325
  • 3
  • 7
6

For moment.js at Vue 3

npm install moment --save

Then in any component

import moment from 'moment'

...

export default {
  created: function () {
    this.moment = moment;
  },

...

<div class="comment-line">
   {{moment(new Date()).format('DD.MM.YYYY [&nbsp;] HH:mm')}}
</div>
Jiro Matchonson
  • 875
  • 1
  • 17
  • 24
6

Moment.js with Vue3 js

npm install moment --save   # npm
yarn add moment             # yarn

Main.ts

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

import moment from 'moment'

const app = createApp(App)

app.config.globalProperties.$moment = moment

app.use(router).mount('#app')

Used moments in vue3 js component

{{ $moment(item.created_at).format("YYYY-MM-DD") }}  // 2021-07-03
Muhammad Shahzad
  • 9,340
  • 21
  • 86
  • 130
1

vue-moment

very nice plugin for vue project and works very smoothly with the components and existing code. Enjoy the moments...

// in your main.js
Vue.use(require('vue-moment'));
// and use in component
{{'2019-10-03 14:02:22' | moment("calendar")}}
// or like this
{{created_at | moment("calendar")}}
kissu
  • 40,416
  • 14
  • 65
  • 133
Awais Jameel
  • 1,838
  • 19
  • 14
1

global members are not available by default in your <template>'s scope. But you can easily pass them on using computed properties.

computed: {
  moment: () => moment,
  console: () => console,
  window: () => window
}

Now you can use any of them in your template. i.e: console.log(moment(), window).

Note this doesn't add any overhead.

tao
  • 82,996
  • 16
  • 114
  • 150
1

I've read the solutions posted here and it seems to be more complex than my solution so I'm presenting this one, what I do is like this

The thing you need:

import moment from 'moment';
...
data() {
  return {
    moment: moment, // This is the one line of code that you need
  }
}

So this is what it looks like

HTML (Now this works):

<h1>{{moment().format('MMMM Do YYYY, h:mm:ss a')}}</h1>

JS:

import moment from 'moment';

export default {
  data() {
    return {
      moment: moment, // This is the one line of code that you need
    }
  }
}
Dev-Raldin
  • 33
  • 1
  • 3
0

I'd simply import the moment module, then use a computed function to handle my moment() logic and return a value that's referenced in the template.

While I have not used this and thus can not speak on it's effectiveness, I did find https://github.com/brockpetrie/vue-moment for an alternate consideration

CodeFromthe510
  • 526
  • 1
  • 5
  • 12
0

TESTED

import Vue from 'vue'
    
Vue.filter('formatYear', (value) => {
  if (!value) return ''
  return moment(value).format('YYYY')
})
Non404
  • 1,130
  • 2
  • 12
  • 22
0

Install the moment module:

npm i moment

In your vue component:

import moment from 'moment';
export default {
   data(){

   },
   methods:{
     moment(date){ return moment(date) }
   }
}

Inside the template:

<span>{{ moment().format('MMMM Do YYYY, h:mm:ss a') }}</span>