SimpleDateFormatは潜在的な危険を使用します

1053 ワード

SimpleDateFormatは、日付タイプから文字列タイプへのフォーマット変換ツールとして非常に使いやすく、簡単な例は以下の通りです.
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date now = new Date();
    String sDate = sdf.format(now);
 
    String date1 = "2011-12-19 12:12:12":
    Date date = sdf.parse(date1);

ここではフォーマットマスクの意味を理解する必要があります.意味がはっきりしていなければ、大文字と小文字が区別されなければ、潜在的な危険を招く可能性があります.フォーマット時間がhhであれば12時間制、HHであれば24時間制です.文字列の日付が12時間の場合、時間ビットはparseの後に0に設定されますが、多くの場合、24時間制が必要で、0に変換されたくない場合があります.このときhhを使うと問題が発生します.
以下の例では時間位は12時間制です
    SimpleDateFormat sDF = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

最近、生産上の問題の一つは、毎日12時にシステムのロックメカニズムが失効し、顧客が同じ取引を何度も提出し、何度も繰り返し記帳する深刻なエラーをもたらしたが、このエラーはめったに現れず、別の顧客の中で類似の問題を出したことがあり、原因が見つからなかったことだ.その後、この問題は12時から13時の間に発生しただけで、お客様はこの時間帯に取引をすることが少なかったため、問題は隠れていて、発見されませんでした.
エラーの最終原因は12時に時間ビットが0に設定され、日付変換エラーが発生し、アプリケーションシステムのロックメカニズムが失効したことです.
また、大文字のMMは月を表し、小文字のmmは分を表し、書き間違えると日付変換が完全に間違っています.