山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

SimpleDateFormatの厳密な・・・setLenient の使い方

2013年には2月29日がありませんが、SimpleDateFormat で厳密な解析を行わない(デフォルトの)場合、勝手に2013年3月1日と解釈してくれます。

public class DateSample {
    public static void main(String[] args) {
        DateFormat dt = new SimpleDateFormat("yyyyMMdd");
        try {
            System.out.println(dt.parseObject("20130229"));
        } catch (ParseException e) {
            System.out.println("Date型に変換できません!!");
        }
    }
}

実行結果

Fri Mar 01 00:00:00 JST 2013


日付や時刻を厳密にチェックするには、setLenient メソッドに false を渡してあげます。(デフォルトは true です。)
「厳密にチェック」とは、存在しない日付を指定された場合、Exception を発生させることです。

public class DateSample {
    public static void main(String[] args) {
        DateFormat dt = new SimpleDateFormat("yyyyMMdd");
        dt.setLenient(false);  // ← ここを追加
        try {
            System.out.println(dt.parseObject("20130229"));
        } catch (ParseException e) {
            System.out.println("Date型に変換できません!!");
        }
    }
}

実行結果

Date型に変換できません!!

ユーザが入力した日付の妥当性チェックを行うときなどに気をつけましょう。


余談ですが、JavaDoc の「setLenient」を見ると「日付/時刻解析を厳密に行うかどうかを設定します。」と書いてあるので、厳密にチェックしたい場合 true をセットしてしまいそうですが、
「Lenient」の意味は「寛大な」ですから「日付/時刻解析を寛大に行うかどうかを設定します。」と、脳内変換してあげましょう。

即戦力にならないといけない人のためのJava入門(Java 8対応) エンタープライズシステム開発ファーストステップガイド (CodeZine BOOKS)

即戦力にならないといけない人のためのJava入門(Java 8対応) エンタープライズシステム開発ファーストステップガイド (CodeZine BOOKS)

  • 作者: 竹田晴樹,渡邉裕史,佐藤大地,多田丈晃,上川伸彦
  • 出版社/メーカー: 翔泳社
  • 発売日: 2016/07/05
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

やさしいJava 第5版 (「やさしい」シリーズ)

やさしいJava 第5版 (「やさしい」シリーズ)