タイトル
TOPJavaTIPS → This Page

SimpleDateFormatの注意点【Java の TIPS、小ネタ、注意点】

前提

Java開発におけるSimpleDateFormatクラスの注意点を紹介します。
このページに記載している内容は2024/10/30に書かれたものです。
掲載している内容が将来的に変更されている場合があります。

よく見かけるSimpleDateFormatクラスの使い方

存在する日付文字列をパースした場合
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * SimpleDateFormat.setLenientの問題確認サンプル1
 * 
 * @author みっちー
 */
public class SimpleDateFormatSetLenient1 {
	/**
	 * メイン
	 * 
	 * @param args パラメータ
	 */
	public static void main(String[] args) {
		System.out.println("SimpleDateFormat.setLenientの問題確認サンプル1");

		DateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		try {
			// 存在する日付を指定
			System.out.println(sdf.parseObject("20240101"));
		} catch (ParseException e) {
			System.out.println("Date型変換失敗");
		}
	}
}

実行結果
SimpleDateFormat.setLenientの問題確認サンプル1
Mon Jan 01 00:00:00 JST 2024

当然、その日付でパースされます。

SimpleDateFormatクラス利用での注意点

しかし2月30日などの存在しない日付を指定すると・・・
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * SimpleDateFormat.setLenientの問題確認サンプル2
 * 
 * @author みっちー
 */
public class SimpleDateFormatSetLenient2 {
	/**
	 * メイン
	 * 
	 * @param args パラメータ
	 */
	public static void main(String[] args) {
		System.out.println("SimpleDateFormat.setLenientの問題確認サンプル2");

		DateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		try {
			// 存在しない日付を指定
			System.out.println(sdf.parseObject("20240230"));
		} catch (ParseException e) {
			System.out.println("Date型変換失敗");
		}
	}
}

実行結果
SimpleDateFormat.setLenientの問題確認サンプル2
Fri Mar 01 00:00:00 JST 2024

なんと、例外が発生すると思いきや、3月1日でパースされてしまいました!?
これは想定外!

これを防ぐには、事前に setLenient メソッドで false を指定します。
(デフォルトで true が指定されています)

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * SimpleDateFormat.setLenientの問題確認サンプル3
 * 
 * @author みっちー
 */
public class SimpleDateFormatSetLenient3 {
	/**
	 * メイン
	 * 
	 * @param args パラメータ
	 */
	public static void main(String[] args) {
		System.out.println("SimpleDateFormat.setLenientの問題確認サンプル3");

		DateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		// 寛大チェックをfalse=>厳密チェック
		sdf.setLenient(false);
		try {
			// 存在しない日付を指定
			System.out.println(sdf.parseObject("20240230"));
		} catch (ParseException e) {
			System.out.println("Date型変換失敗");
		}
	}
}

実行結果
SimpleDateFormat.setLenientの問題確認サンプル3
Date型変換失敗

setLenient(true) は寛大なチェックという意味になるので
setLenient(false) で厳密なチェックにすれば勝手に変な日付でパースされることはなくなります。

更新履歴

2024/10/30 新規作成

TOPJavaTIPS → This Page