裏紙に書く程度の内容

Moment で Deprecation waring

Moment.jsを使ってたら何やらわーにんぐがでてきた。

問題の状況

初期化のところでwarningが出る。

Deprecation warning: moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.

内容的には非推奨だから使うなって書いてあるけど、初期化時に指定した文字列が日時として読込可能なフォーマットになっていないのが原因ぽい。

var hoge = moment(date);

自分の場合、上記コードでdateはsqlserverから取得したdatetimeのデータを使っているんだけど、環境(DB接続のドライバ)によってこの中身の取れ方が異なっていたためバグになっていました。

展開すると以下のような感じ

var hoge = moment('2016-07-22 14:04:09.000');    // 開発環境。これは問題なし
var hoge = moment('Jul 22 2016 02:04:09:000PM'); // こっちはNG

下の方の、文字列が日時として正しく認識されないわけです。

対処方法

修正方法としては以下2パターン。

フォーマットを指定する方法

Moment.js の初期化時、フォーマットを指定することが出来ます。
指定の文字列どういうフォーマットになっているかを指定すれば日時を正しく認識できます。

var hoge = moment('Jul 22 2016 02:04:09:000PM', 'MMM DD YYYY HH:mm:ss:SSSA');

これでOK。

元の文字列を認識できるように変更

そもそもmoment('2016-07-22 14:04:09.000')の形式なら問題ないんだから、元の文字列を変えてしまってもOK.

自分の場合はSQLで日時データをを取得している部分を

convert(varchar, hoge_date, 121) as hoge_date,

としてコンバートしてしまって対応しました。


どっちがいいかはその状況によります。
※可能なら前者の方がいいとは思いますが。

環境によって日時データのフォーマットが変わってしまうなら、後者の方が手っ取り早いかと思います。

参考

tweetの投稿時刻をmoment.jsで形式変換するときに警告される

Index
広告