Moment: ISO フォーマットに一致するときにメリディエム インジケーターを探す

作成日 2016年02月23日  ·  15コメント  ·  ソース: moment/moment

#2983 に示されているように、日付形式 "2016-02-23 11:31:23 PM" を使用すると、そうでない場合でも ISO 形式と一致します。 これにより、間違った日付が解析されます。

moment('2016-02-23 11:31:23 PM').format() = "2016-02-23T11:31:23-06:00"

これは、2016-02-23 11:31:23 が技術的に ISO 形式であるためです。
from-string ファイルを変更して、meridiem インジケーターをチェックし、ISO 形式があれば一致する以外のことを行う必要があります。

Bug Forgiving parsing

全てのコメント15件

おっと! 確実に誰かに噛み付きそうです。 非推奨の警告もありません。

たとえば、 extendedIsoRegexbasicIsoRegexの最後にextendedIsoRegex $を追加するなどして、ISO チェッカーが文字列の最後まで行くことを確認するだけで十分のようです。

@icambron私たちはそれができないと思います。 現在、次のテストに合格しています。

    assert.ok(moment('2016-01-01 is my date').isValid(), 'test extra chars after iso date')

そんなことをやっている人が世界中にいるのはほぼ確実です。 正規表現を変更すると、そのテストは失敗します (まだ見つけていないいくつかの他のものと一緒に)。

ええ、わかりました。 私が考えているのは、それを非推奨にして、この AM/PM のサポートを終了するときに修正することです。 私たちがmoment('2016-01-01 is my date')サポートする_べき_とする正当な理由が見当たりません

私はこれについて少し考えてきましたが、私たちが見ているパーサーの問題のいくつかに対する最も侵襲性の低い答えは、この問題のようにパーサーを実際にデフォルトでstrictモードにすることなのだろうかと思っています. 多くの場合、(この問題のように) 許される解析の問題は、厳密モードに切り替えることで解決されるようです (ユーザーは最初から厳密モードを使用していたはずだからです)。 おそらく、これは「人々が成功の穴に落ちるのを助ける」ことの 1 つでしょうか? これにより、既存の機能が使用可能になりますが、開発者を正しい道に押しやります。

同意します、私たちは長い間それを望んでいました。 長い間3.0の可能性があるアイテムとして挙げられてきたと思います。 しかし、確かに automagic one-arg signature を strict にすることは、それに向けた小さな一歩です。

私は実際に、デフォルトで true に設定した globalStrict というトグル可能なグローバル状態変数を追加して、今日、デフォルトでstrict-mode-by-defaultのコーディングを開始しました。 次に、次を呼び出すことにより、strict モード設定を false に戻すことができます。

moment.globalStrict(false)

これにより、モーメントのパーサーへのすべての呼び出しを変更することなく、すべてがこれまでと同じように動作します。
この変更を行うには約 4 行のコードが必要です - そして、何百もの単体テストを修正する必要があります:-)
しかし、私にとっては、これは v3 を待たずにデフォルトで厳格にロールアウトする方法かもしれません。
ユーザーは簡単に元に戻すことができるので、あまり文句を言わずに変更を受け入れてくれるのではないかと思います。

または、globalStrict 設定をデフォルトで false にすることができ、ドキュメントで開発者に true に設定することを強くお勧めします。 これは侵襲性が低く、おそらく役立つでしょうか?
グローバルな状態変数がテスト可能性の観点からすくうと言ったのは私が初めてです。その理由だけでも、この考えはひどいものかもしれません。

提案されたように、デフォルトの 1 つの引数でstrict モードを呼び出すこともできます。 しかし、それは、JS の日付構造にまだフォールバックしているおそらく何千人もの人々を動揺させるでしょう。

次の 1 つを除いて、すべてが気に入っています。

しかし、それは、JS の日付構造にまだフォールバックしているおそらく何千人もの人々を動揺させるでしょう。

明確にするために、私の提案は、can't-fall-back-to-JS-constructor の非推奨化を終わらせることではありませんでした。 実際には、その逆です。この場合、私たちはそれを実行したいのですが、ISO チェックが先取りしているのです。

それで、あなたは世界的な国家のことを試みると言っていますか、それともそれを避けますか? たぶん、私はユニットテストを終えてPRを作成し、そこでそれについて話すことができます.

申し訳ありませんが、私は明確ではありませんでした。私は世界的な国家のことについてはまったく反対していません。 状態が設定されていなくても、 moment(string)の ISO チェックを常に厳格にすることを妨げるとは思いません。

@maggiepint正しいスレッドを教えてくれてありがとう。
そして、あなたは上で私が「そこにいる人々の1人」であると正しく述べました:Pは次のよ​​うなことをしています
moment("2016-04-06Tnull").isValid()
その瞬間が無効な文字列を拒否することを完全に確信しています。

では、デフォルトで厳密な解析を有効にする最も簡単な方法は何ですか? (失礼、怠け者)

@Aukhan厳密モードの解析の問題を最初に修正する必要があるため、グローバル ストリクトを実装しませんでした。 (しかし、そうでしたので、まだそこに着くかもしれません)。

あなたがやっていることを達成するには、コードで ISO_8601 定数とstrict モードをインラインで指定する必要があると思います:

moment("2016-04-06Tnull", moment.ISO_8601, true).isValid()
false

@maggiepintお返事ありがとうございます...

それは素晴らしい提案ですが、ISO_8601 だけでなくさまざまなカスタム形式が使用されている数百のそのような式を置き換えたくないので、グローバル ストリクト オプションがあればいいと思います。
私はコードベースを調べ始めましたが、明らかに、そのような巨大で素晴らしい仕事は一朝一夕で理解することはできません。

私は必要なスキルを持っていないかもしれませんが、何かお手伝いできることがあればお知らせください。
ありがとう!

@Aukhanその作業項目を再びピックアップできないかどうかを確認します。 問題は、これを機能させるには、PR #3078 をマージする必要があることです。 それが最初に物を落とした理由です。

#3502 を支持して終了

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