2016/09/06

moment.jsで1ヶ月前(30日前)などが正確に取得できないときの対処法

JavaScriptで日付を扱うなら、ぜひ使いたい「moment.js」というライブラリがある。
仕事で実際に使っていたのだが、なぜか「1ヶ月前」や「30日前」の日付がうまく取得できない。1ヶ月後なら大丈夫なのに…。

ちょっとハマったので、1ヶ月前や○日前の日付を正確に取得する方法を紹介する。

1ヶ月前(30日前)の日付を取得する


const today = '2016-08-24';

const thirtyDaysAgo = moment(today).day(-30).format();
// "2016-07-22T00:00:00+09:00"

moment(today).diff(thirtyDaysAgo, 'day');
// 33

moment().day(-30)をするとなぜか33日前になってしまった。どうやらマイナスの値を渡すと計算がおかしくなるようだ。
そこで、ちゃんと30日前を取得するためには、以下のような実装をする必要がある。

const today = '2016-08-24';

const thirtyDaysAgo = moment(today).add(-30, 'days').format();
// "2016-07-25T00:00:00+09:00"

// マイナスを使いたくない場合はsubtractでもOK
const thirtyDaysAgo = moment(today).subtract(30, 'days').format();

moment(today).diff(thirtyDaysAgo, 'day')
// 30

add(-30, 'days') または subtract(30, 'days') をすると、正確な日付が取得できる。
1ヶ月前なら add(-1, 'months') または subtract(1, 'months') となる。


以上

written by @bc_rikko

0 件のコメント :

コメントを投稿