1

Javascript を使用したユーザー入力の解析に問題があり、パーサーが ddMMyyyy の日付を正しく受け入れられません。区切り文字がある場合、正しく解析されます。

以下の例では、DateJS (NZ ローカライズ) を使用しています。私は、新しいMomentJで最初の試みを行いました(これは、入力の検証に理想的であることが証明されていません)。入力ケースを適切に処理する場合は、他のフレームワークを受け入れます。

私のテストケース:

// Parses correct value
var dateWithHyphens = Date.parse('01-06-2012');

// Parses incorrectly, using MMddyyy, instead of ddMMyyyy
var dateWithoutHyphens = Date.parse('01062012');

// Parses incorrectly, using MMddyyy, instead of ddMMyyyy
var dateWithFormat = Date.parse('01062012', { format: 'ddMMyyyy'});

このために JSFiddle を作成しました: http://jsfiddle.net/ajwxs/1

テスト ケースは 6 月 1 日を返すはずですが、間違ったテスト ケースは 1 月 6 日を返します (これは入力の解析であり、出力の書式設定が遅すぎます)。

これらの日付を解析するために正しい形式を使用するように JSDate をより適切に提案できるかどうかについての提案はありますか?

アップデート

このアプリケーションでは、次のような多数の可能なユーザー入力を検証しています。

01062012
01/06/2012
010612

これにより、parseExact スタイルの実装の実装が少し冗長になります...

4

2 に答える 2

2

DateJSについてはわかりませんが、目的のMMddyyyy場所を想定していることがわかった場合はddMMyyyy、文字列をすばやく置き換えて、MMddyyyy解析する前に文字列を切り替えることができます。

Date.parse( '01062012'.replace(/^(\d\d)(\d\d)(\d\d\d\d)$/,"$2$1$3") );

または、同様の置換を行ってハイフンを挿入し、次のようにしdd-MM-yyyyます。

Date.parse( '01062012'.replace(/^(\d\d)(\d\d)(\d\d\d\d)$/,"$1-$2-$3") );

いずれにせよ、すでにハイフンが含まれている文字列は変更されないままであるため、最初の(成功した)テストケースに従って解析されます。

于 2012-05-23T00:17:51.783 に答える
1

Date.parseExactメソッドを使用したい。何らかの理由で、通常の解析では機能しないのに機能します。また、オブジェクトにラップされた format オプションを渡す必要はありません。

仕様によると、 Date.parse はフォーマットオプションを取ることは想定されていないため、おそらくそれが理由です。

// Parses correctly
var dateWithFormat = Date.parseExact('01062012', 'ddMMyyyy');

念のためにjsfiddleも更新しました。

アップデート

問題は、パーサーが一連の単純な形式をハードコーディングし、場合によっては日付、月、年の順序のローカライズ設定を上書きすることだと思います。Date を使用する場所の前に次を配置すると、問題が修正されます。

Date.Grammar._formats = Date.Grammar.formats([
    "\"yyyy-MM-ddTHH:mm:ssZ\"",
    "yyyy-MM-ddTHH:mm:ssZ",
    "yyyy-MM-ddTHH:mm:ssz",
    "yyyy-MM-ddTHH:mm:ss",
    "yyyy-MM-ddTHH:mmZ",
    "yyyy-MM-ddTHH:mmz",
    "yyyy-MM-ddTHH:mm",
    "ddd, MMM dd, yyyy H:mm:ss tt",
    "ddd MMM d yyyy HH:mm:ss zzz",
    "ddMMyyyy",
    "MMddyyyy",
    "ddMyyyy",
    "Mddyyyy",
    "dMyyyy",
    "Mdyyyy",
    "yyyy",
    "dMyy",
    "Mdyy",
    "d"
]);

これは見栄えがよくありませんが、考えられるすべてのオプションをリストするよりも、少しだけではありますが確実に短くなります。風変わりではない Date ライブラリを見つけることができれば、それがより良い選択肢になるかもしれません。

于 2012-05-23T00:44:56.343 に答える