/*
 * DateUtil.java
 * Copyright (C) 2008 Cyber Beans Corporation. All rights reserved.
 */
package jp.co.cybec.cb3.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

 /**
  * 日付ユーティリティクラス。
  * @author Jianming Guo
  */
public class DateUtil {
	/** デフォールトの日時フォーマット書式 */
	public static final String DEFAUL_PATTERN =  "yyyy/MM/dd HH:mm:ss";

	/** デフォールトの日時フォーマット書式 */
	public static final String DEFAUL_TIMESTAMP_PATTERN =  "yyyy/MM/dd HH:mm:ss.SSS";

	/**
	 * 文字列を日付型にパースします。
	 *
	 * @param value パースする文字列
	 * @return パース後の日付
	 * @exception ParseException パースに失敗した場合に発生します。
	 */
	public static Date parseDate( String value ) throws ParseException{
		return parseDate(value, DEFAUL_PATTERN, true);
	}

	/**
	 * 文字列を日付型にパースします。
	 *
	 * @param value  パースする文字列
	 * @param format フォーマット書式
	 * @return パース後の日付
	 * @exception ParseException パースに失敗した場合に発生します。
	 */
	public static Date parseDate(String value, String format) throws ParseException {
		return parseDate(value, format, true);
	}

	/**
	 * 文字列を日付型にパースします。
	 *
	 * @param value  パースする文字列
	 * @param format フォーマット書式
	 * @param lenient trueの場合は厳密ではない解析
	 * @return パース後の日付
	 * @exception ParseException パースに失敗した場合に発生します。
	 */
	public static Date parseDate(String value, String format, boolean lenient) throws ParseException {
		SimpleDateFormat df = new SimpleDateFormat(format);
		df.setLenient(lenient);

		return value != null ? df.parse(value) : null;
	}

	/**
	 * 日付をフォーマットします。
	 *
	 * @param date フォーマットする日付
	 * @return フォーマット後の文字列
	 * @throws IllegalArgumentException 指定された引数でフォーマットできない場合に発生します。
	 */
	public static String formatDate(java.util.Date date) throws IllegalArgumentException {
		return formatDate(date, DEFAUL_PATTERN);
	}

	/**
	 * 日付をフォーマットします。
	 *
	 * @param date フォーマットする日付
	 * @param format フォーマット書式
	 * @return フォーマット後の文字列
	 * @throws IllegalArgumentException 指定された引数でフォーマットできない場合に発生します。
	 */
	public static String formatDate(java.util.Date date, String format) throws IllegalArgumentException {
		SimpleDateFormat df;

		if (date == null) {
			return null;
		}

		if (format != null) {
			df = new SimpleDateFormat(format);
		} else {
			// フォーマット書式が未指定の場合
			df = new SimpleDateFormat(DEFAUL_PATTERN);
		}

		return format != null ? df.format(date) : df.format(date);
	}

	/**
	 * Timestampをフォーマットします。
	 *
	 * @param timestamp フォーマットするTimestamp
	 * @return フォーマット後の文字列
	 * @throws IllegalArgumentException 指定された引数でフォーマットできない場合に発生します。
	 */
	public static String formatTimestamp(java.sql.Timestamp timestamp) throws IllegalArgumentException {
		return formatTimestamp(timestamp, DEFAUL_TIMESTAMP_PATTERN);
	}

	/**
	 * Timestampをフォーマットします。
	 *
	 * @param timestamp フォーマットするTimestamp
	 * @param format フォーマット書式
	 * @return フォーマット後の文字列
	 * @throws IllegalArgumentException 指定された引数でフォーマットできない場合に発生します。
	 */
	public static String formatTimestamp(java.sql.Timestamp timestamp, String format) throws IllegalArgumentException {
		SimpleDateFormat df;

		if (timestamp == null) {
			return null;
		}

		if (format != null) {
			df = new SimpleDateFormat(format);
		} else {
			// フォーマット書式が未指定の場合
			df = new SimpleDateFormat(DEFAUL_TIMESTAMP_PATTERN);
		}

		return format != null ? df.format(timestamp) : df.format(timestamp);
	}
}
