package com.nifty.cloud.ncs.util;

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

/**
 * 日時の変換やフォーマットに関するユーティリティです。
 */
public class DateUtils
{
	/** RFC 822形式を表す文字列です。 */
	public static final String RFC822_FORMAT = "EEE, dd MMM yyyy HH:mm:ss z";
	/** x-amz-date形式を表す文字列です。 */
	public static final String AMZ_DATE_FORMAT = "yyyyMMdd'T'HHmmss'Z'";
	/** ISO 8601形式を表す文字列です。 */
	public static final String ISO8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";

	/**
     * 指定した日時をRFC 822形式で表される文字列として返却します。
     *
     * @param date
     *            フォーマット対象日時
     *
     * @return 指定した日時をRFC 822形式で表わした文字列
     */
	public static String formatRfc822Date(Date date)
	{
		SimpleDateFormat sdf = new SimpleDateFormat(RFC822_FORMAT, Locale.US);
		sdf.setTimeZone(new SimpleTimeZone(0, "GMT"));

		return (sdf.format(date));
	}

    /**
     * 指定した日時文字列をRFC 822形式で表されるDateオブジェクトに変換し、返却します。
     *
     * @param value
     *            変換対象文字列
     *
     * @return 変換後のDateオブジェクト
     *
     * @throws ParseException
     *             日時文字列の変換に失敗したことを示します。
     */
	public static Date parseRfc822Date(String value) throws ParseException
	{
		SimpleDateFormat sdf = new SimpleDateFormat(RFC822_FORMAT, Locale.US);
		sdf.setTimeZone(new SimpleTimeZone(0, "GMT"));
		Date date = sdf.parse(value);

		return (date);
	}

    /**
     * 指定した日時をISO 8601形式で表される文字列として返却します。
     *
     * @param date
     *            フォーマット対象日時
     *
     * @return 指定した日時をISO 8601形式で表した文字列
     */
    public static String formatIso8601Date(Date date)
    {
		SimpleDateFormat sdf = new SimpleDateFormat(ISO8601_FORMAT, Locale.US);
		sdf.setTimeZone(new SimpleTimeZone(0, "GMT"));

		return (sdf.format(date));
    }

	/**
	 * 指定した日時をx-amz-date形式で表される文字列として返却します。
	 *
	 * @param date
	 *            フォーマット対象日時
	 *
	 * @return 指定した日時をx-amz-date形式で表した文字列
	 */
	public static String formatAmzDate(Date date)
	{
		SimpleDateFormat sdf = new SimpleDateFormat(AMZ_DATE_FORMAT, Locale.US);
		sdf.setTimeZone(new SimpleTimeZone(0, "GMT"));

		return (sdf.format(date));
	}

    /**
     * 指定した日時文字列をISO 8601形式で表されるDateオブジェクトに変換し、返却します。
     *
     * @param value
     *            変換対象文字列
     *
     * @return 変換後のDateオブジェクト
     *
     * @throws ParseException
     *             日時文字列の変換に失敗したことを示します。
     */
	public static Date parseIso8601Date(String value) throws ParseException
	{
		SimpleDateFormat sdf = new SimpleDateFormat(ISO8601_FORMAT, Locale.US);
		sdf.setTimeZone(new SimpleTimeZone(0, "GMT"));
		Date date = sdf.parse(value);

		return (date);
	}

}
