0

これはよく知られている質問で、stackoverflow にすでに登場しています。Web アプリケーションのバグを解決するよう依頼されました。Web フォームから取得した日付があります。ユーザーは有効な日付を特定の形式で入力する必要がありますdd/MM/yyyy

アプリケーションはフレームワークとして Struts 1.3 を使用しています。これは、対応する FormBean の validate メソッドで見つけたものです。

DateFormat dateFormat = new SimpleDateFormat( "dd/MM/yyyy", aLocale ); 
try{
     mydate = dateFormat.parse( formDate );
}
catch( ParseException pe ){
     errors.add( "error", new ActionError( "error.date.invalid" ) );
}

ただし、たとえば、ユーザーが年を短い形式で入力した場合、つまり01/10/12、日付に変換された場合、見つけたデータベースを調べたときにエラーが発生しないことが発生しています01/10/0012

簡単な修正として を使用しようとしましsetLenient(false)たが、例外はまだ発生せず、mydate は依然として有効ですが間違った日付になります。

正規表現と文字列の事前解析をいじる前に、何か足りないのではないかと思っていました。特に、日付形式のインスタンス化内でロケールが使用されている場合。

プロジェクトで使用されている現在の Jdk は 1.5 です

4

2 に答える 2

1

次のような書式パターンを使用できます。

DateFormat dateFormat = new SimpleDateFormat( "dd/MM/yy", aLocale ); 

したがって、「01/11/12」は 2012 年 1 月 11 日に、「01/11/86」は 1986 年 1 月 11 日に変換されます。

年が「yyyy」形式の場合、桁数に関係なく、年は文字どおりに解釈されます。

詳細については、http: //docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#yearを参照してください。

または、「dd/mm/yyyy」形式の javascript/Java コードでユーザー入力を処理できます。ユーザーが日付を「dd/mm/yyyy」形式でのみ入力するように制限します。

于 2012-10-01T11:09:59.550 に答える
0

問題は、 を01/10/12 満たすことdd/MM/yyyyです。それは(あなたが発見したように)西暦12年を指しているだけです。

オプションは次のとおりです。

  1. フロント エンド フィルタリングを行います (10 文字未満の日付文字列を許可しないか、年が妥当な範囲内であることを確認します)。おそらく JavaScript で日付を評価し、1900 より前 (または適切なカットオフと思われるもの) にエラーを表示します。ユーザー (または、それが望ましいと思われる場合は自動修正、それに関する問題については 2 を参照してください)
  2. 日付を解析し、2 文字だけで明確に入力された年を「修正」した後、日付オブジェクトを評価します (これは難しい場合があります。19XX から 20XX へのカットオフをどのように処理しますか?)。
  3. 何らかの締め切り前の日付に対して例外を返します (おそらく UI によって処理されます) (おそらく、クライアント側の検証と組み合わせて使用​​するのが最適です)。
  4. Web ウィジェット (日付ピッカー) を介してのみ日付を入力できるようにします。

私の投票は、1 と 3 の組み合わせです。1 は JavaScript が有効な場合、3 は JS 検証が失敗するまれなインスタンスを処理する場合です。

于 2012-10-01T10:55:32.707 に答える