0

moment.js String + Formatsのドキュメントを参照すると、これらの 2 つの行が同じ日付オブジェクトを返すと予想していました。

moment('12.05.1989', ['DD.MM.YYYY','YYYY-MM-DD']);
moment('1989-05-12', ['DD.MM.YYYY','YYYY-MM-DD']);

しかし、私が得るのは最初のデートでこれです:

{ _i: '12.05.1989',
  _f: 'YYYY-MM-DD',
  _l: undefined,
  _isUTC: false,
  _a:
   [ 12,
     4,
     19,
     0,
     0,
     0,
     0 ],
  _d: Sat May 19 12 00:00:00 GMT+0200 (W. Europe Summer Time),
  _isValid: true }

2番目は正しいですが:

{ _i: '1989-05-12',
  _f: 'YYYY-MM-DD',
  _l: undefined,
  _isUTC: false,
  _a:
   [ 1989,
     4,
     12,
     0,
     0,
     0,
     0 ],
  _d: Fri May 12 1989 00:00:00 GMT+0200 (W. Europe Summer Time),
  _isValid: true }

配列内のフォーマットの順序を変更すると、まったく逆になり、配列内の最後のフォーマットが使用されます。

私は何を間違っていますか?

「-」や「.」の文字列をチェックするような回避策は避けたいです。

4

1 に答える 1

1

ドキュメントには次のように記載されています。

パーサーは英数字以外の文字を無視するため、次の両方が同じものを返します。

moment("12-25-1995", "MM-DD-YYYY");
moment("12\25\1995", "MM-DD-YYYY");

あなたの場合、12.05.1989最後のパターン ( ) と一致し、「12 年の 5 番目の月の 1989 日」YYYY-MM-DDとして解析します (それ以外の場合は意味をなさないため、日を切り捨てます)。

ただし、これを防ぐ方法がわからないため、日付形式を正規化する必要がある場合があります。

> '12.05.1989'.replace(/(\d{2})\.(\d{2})\.(\d{4})/, '$3-$2-$1')
'1989-05-12'
于 2013-05-16T06:27:38.783 に答える