2020年5月26日火曜日

JavaのSimpleDateFormatで日付文字列チェックではまる

java.text.SimpleDateFormatを使って日付文字列をチェックしようとしてはまったときのメモ。 parseメソッドに文字列を与えてParseExceptionが出るか出ないかでチェックしようとした。

  1. SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");  
  2.   
  3. // 不正な日付  
  4. Date d = fmt.parse("197405112"); // ParseExceptionが発生しない!!  

しかし、エラーとはならず、yyyy=1970、MM=05、dd=112と解釈され、5月112日→8月20日として、d=1974/8/20として通ってしまい予想外の動きになってしまった。 SimpleDateFormatはデフォルトだとできるだけ日付として解釈するように動作をするらしい。 日付を3桁で拾ってしまうのは予想外だったが・・・

存在しない日付を厳密にチェックするときはsetLenientをfalseに設定する必要があるようだ。 以下にすることでチェックをすることができた。

  1. SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");  
  2.   
  3. // 厳密な日付チェックを行う設定  
  4. fmt.setLenient(false);  
  5.   
  6. // 不正な日付  
  7. Date d = fmt.parse("197405112"); // ParseException発生!!  

SimpleDateFormatはスレッドセーフではなく使いまわしが難しいので、そろそろ新しいスレッドセーフなDateTimeFormatterに移行するべきとは思うが、Dateを使っている手持ちライブラリも多く使い勝手の悪さからなかなか移行できていない・・・

0 件のコメント:

コメントを投稿