Moment: フォールバックなしで値を解析する

作成日 2015年07月10日  ·  9コメント  ·  ソース: moment/moment

moment(value)任意の値を渡すと、#1407に従って非推奨の警告が生成されます。

この解析を使用する方法があれば、Dateコンストラクターにフォールバックせずに本当にいいでしょう。 私がこれまでに見つけた唯一の方法はかなり不器用です:

if (moment.isDate(value)) {
    return moment(value);
} else {
    return moment(value, moment.ISO_8601);
}

それでも、これはASP.net /Date(1198908717056)/文字列を解析しません。

最も簡単なオプションは、厳密なオプションを2つの引数形式で許可することです: moment(value, true)

ありがとう。

Enhancement

最も参考になるコメント

@SystemParadoxが役立つ場合は、私はあなたと同様の問題を抱えていて、次のようなラッパー関数を作成することになりました。

function disableNativeDateFallback(config) {
    config._d = new Date(parseFloat('NaN')); // an invalid date
}
function makeMomentWrapper(momentFn) {
    return function() {
        var prevFallback = moment.createFromInputFallback;
        moment.createFromInputFallback = disableNativeDateFallback;
        var result = momentFn.apply(null, arguments);
        moment.createFromInputFallback = prevFallback;
        return result;
    }
};
var momentStrict = makeMomentWrapper(moment);
momentStrict.utc = makeMomentWrapper(moment.utc);

他のコードへの影響を避けるために、 createFromInputFallback簡単に置き換えてから、戻る前に復元することで機能します。 移行する準備ができているコードは、 momentmoment.utc代わりにmomentStrictmomentStrict.utc使用でき、残りはそのまま使用できます。

全てのコメント9件

明確にするために、厳密モードを使用せずに、警告を表示するのではなく、フォールバックを無効にする方法を求めていますよね?

はい、 moment()サポートするすべてのものを自動的に解析したいのですが、すべて失敗した場合は、警告を出力してDateコンストラクターを使用する代わりに、無効な日付を生成したいと思います。

moment将来のバージョンの動作にプリエンプティブにオプトインしたいのですが、非推奨のDateコンストラクターフォールバックは完全に削除されます。

厳密モードの意味が正確にはわかりません。 moment(value, 'YYYY-MM-DD')ような正確な形式を渡すときはどういう意味ですか? もしそうなら、これは役に立ちません。1。非常に冗長であり、2。 moment(value)Dateコンストラクターに頼る前に解析できるすべての形式がまだ含まれていないためです。

厳密モードを有効にするには、最後のパラメーターとしてtrueを渡します。 それはドキュメントにあります。 基本的に、これは文字列が_exactly_の形式と一致する必要があることを意味します。

moment(String)直接サポートされている形式はドキュメントに記載されているので、これをstrictモードと同じように考えるのは許容できると思います。 つまり、 moment(String, Boolean)追加します。

はい、それは素晴らしいことです。 ありがとう。

@SystemParadoxはい、必要なものはサポートされています。 moment.createFromInputFallback(config)オーバーライドするだけです:

moment.createFromInputFallback = function (config) {
    config._d = new Date(NaN);
}

私はそれが些細なことではないことに同意しますが、それは可能です;-)

これは便利ですが、設定をグローバルに変更します。

一度に1つの呼び出しでコードベースを段階的に移行したい場合はどうすればよいですか?

moment(String, true)サポートを追加できないのはなぜですか?

回避策はありますが、これをパブリックAPIに含めると、さまざまなユースケースに役立ちます。 組み込みフォーマットのみに関する検証を求める#2535も検討してください。

必要なのはmoment.JS_DATE定数です。つまり、入力をnew Dateに渡すだけです。https://github.com/moment/moment/issues/1686を確認して

@SystemParadoxが役立つ場合は、私はあなたと同様の問題を抱えていて、次のようなラッパー関数を作成することになりました。

function disableNativeDateFallback(config) {
    config._d = new Date(parseFloat('NaN')); // an invalid date
}
function makeMomentWrapper(momentFn) {
    return function() {
        var prevFallback = moment.createFromInputFallback;
        moment.createFromInputFallback = disableNativeDateFallback;
        var result = momentFn.apply(null, arguments);
        moment.createFromInputFallback = prevFallback;
        return result;
    }
};
var momentStrict = makeMomentWrapper(moment);
momentStrict.utc = makeMomentWrapper(moment.utc);

他のコードへの影響を避けるために、 createFromInputFallback簡単に置き換えてから、戻る前に復元することで機能します。 移行する準備ができているコードは、 momentmoment.utc代わりにmomentStrictmomentStrict.utc使用でき、残りはそのまま使用できます。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

ninigix picture ninigix  ·  3コメント

danieljsinclair picture danieljsinclair  ·  3コメント

IbraheemAlSaady picture IbraheemAlSaady  ·  3コメント

benhathaway picture benhathaway  ·  3コメント

vbullinger picture vbullinger  ·  3コメント