package com.qmth.qrzk.repository.utils;

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

public class DateHelper {

    private static Calendar gobalCalendar = Calendar.getInstance();

    /**
     * yyyy-MM
     */
    public final static SimpleDateFormat yearMonthFormat = new SimpleDateFormat("yyyy-MM");

    /**
     * yyyy-MM-dd
     */
    public final static SimpleDateFormat shortSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

    /**
     * yyyy-MM-dd HH:mm:ss
     */
    public final static SimpleDateFormat longSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * yyyyMMdd
     */
    public final static SimpleDateFormat shortSimpleDateFormatWithoutSplit = new SimpleDateFormat("yyyyMMdd");

    /**
     * yyyyMMddHHmmss
     */
    public final static SimpleDateFormat longSimpleDateFormatWithoutSplit = new SimpleDateFormat("yyyyMMddHHmmss");

    public final static String[] WeekNames = new String[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };

    public final static String[] MonthNames = new String[] { "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月",
            "十月", "十一月", "十二月" };

    public final static int DaySeconds = 86400;

    public final static int HourSeconds = 3600;

    /**
     * 使用yyyy-MM-dd HH:mm:ss模式解析时间字符串，如果解析不出来，返回null
     * 
     * @param source
     * @return
     */
    public static Date parseLongString(String source) {
        try {// 设置lenient为false.
             // 否则SimpleDateFormat会比较宽松地验证日期，比如2007-02-29会被接受，并转换成2007-03-01
            longSimpleDateFormat.setLenient(false);
            return longSimpleDateFormat.parse(source);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 使用yyyy-MM-dd模式解析时间字符串，如果解析不出来，返回null
     * 
     * @param source
     * @return
     */
    public static Date parseShorString(String source) {
        try {// 设置lenient为false.
             // 否则SimpleDateFormat会比较宽松地验证日期，比如2007-02-29会被接受，并转换成2007-03-01
            shortSimpleDateFormat.setLenient(false);
            return shortSimpleDateFormat.parse(source);
        } catch (Exception e) {
            return null;
        }
    }
    
    /**
     * 使用yyyy-MM模式解析时间字符串，如果解析不出来，返回null
     * 
     * @param source
     * @return
     */
    public static Date parseYearString(String source) {
        try {// 设置lenient为false.
        	yearMonthFormat.setLenient(false);
            return yearMonthFormat.parse(source);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 使用yyyy-MM-dd HH:mm:ss或者yyyy-MM-dd模式解析时间字符串，如果都解析不出来，返回null
     * 
     * @param source
     * @return
     */
    public static Date parseString(String source) {
        if (source.contains(":")) {
            return parseLongString(source);
        }
        return parseShorString(source);
    }

    /*****
     * 根据年、月、日设置日期，并返回设置好的日期
     * 
     * @param year
     * @param month
     * @param date
     */
    public static Date setDate(int year, int month, int date) {
        gobalCalendar.set(year, month, date);
        return gobalCalendar.getTime();
    }

    /****
     * 按照yyyy-MM-dd格式返回当前的日期
     */
    public static String toShortString() {
        return toShortString(new Date());
    }

    /****
     * 按照yyyy-MM-dd格式返回date日期
     */
    public static String toShortString(Date date) {
        return shortSimpleDateFormat.format(date);
    }

    /****
     * 按照yyyy-MM-dd HH:mm:ss格式返回当前的日期
     * 
     * @return
     */
    public static String toLongString() {
        return toLongString(new Date());
    }

    /****
     * 按照yyyy-MM-dd HH:mm:ss格式返回date日期
     * 
     * @return
     */
    public static String toLongString(Date date) {
        return longSimpleDateFormat.format(date);
    }
    


    /****
     * 按照yyyy-MM格式返回date日期
     * 
     * @return
     */
    public static String toYearMString(Date date) {
        return yearMonthFormat.format(date);
    }

    public static Date addValues(int filed, int value) {
        return addValues(new Date(), filed, value);
    }

    /********
     * 为date日期增加的数值
     */
    public static Date addValues(Date date, int filed, int value) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(filed, value);
        return c.getTime();
    }

    /******
     * 返回中文日期 2010年11月11日 星期二
     */
    public static String toChineseString() {
        return toChineseString(new Date());
    }

    /******
     * 返回中文日期 2010年11月11日 星期二
     */
    public static String toChineseString(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        return sdf.format(date) + " " + WeekNames[c.get(Calendar.DAY_OF_WEEK) - 1];
    }

    public static String getTicketTimes(Date maxTime, Date minTime) {
        if (maxTime == null || minTime == null)
            return "";
        long times = maxTime.getTime() - minTime.getTime();
        if (times < 0)
            times = 0 - times;
        int value = Integer.parseInt(times + "");

        int day = value / (DaySeconds * 1000);
        value = value - day * DaySeconds * 1000;

        int hour = value / (HourSeconds * 1000);
        value = value - hour * HourSeconds * 1000;

        int minute = value / 6000;

        value = value - minute * 6000;

        int second = value / 1000;

        String returnValue = "";
        if (day > 0)
            returnValue = day + "d";
        if (hour > 0)
            returnValue = returnValue + hour + "h";
        if (minute > 0)
            returnValue = returnValue + minute + "m";
        if (second > 0)
            returnValue = returnValue + second + "s";
        return returnValue;

    }

    /**
     * 获取当前时间
     * 
     * @return yyyy-MM-dd HH:mm:ss
     */
    public static String getNow() {
        return getNow(longSimpleDateFormat);
    }

    /**
     * 格式化时间，返回格式化后的时间字符串
     * 
     * @param date
     * @param formatPattern
     * @return
     */
    public static String formatDate(Date date, SimpleDateFormat formatter) {
        if (date == null) {
            return "";
        }
        return formatter.format(date);
    }

    /**
     * 格式化时间，返回格式化后的时间字符串
     * 
     * @param date
     * @param formatPattern
     * @return
     */
    public static String formatDate(Date date, String formatPattern) {
        if (date == null) {
            return "";
        }
        return formatDate(date, new SimpleDateFormat(formatPattern));
    }

    /**
     * 按照标准的yyyy-MM-dd HH:mm:ss来格式化时间
     * 
     * @param date
     * @return
     */
    public static String formatDate(Date date) {
        return formatDate(date, longSimpleDateFormat);
    }

    /**
     * 依据格式获取当前时间
     * 
     * @param format
     * @return
     */
    public static String getNow(SimpleDateFormat formatter) {
        Date date = new Date();
        return formatter.format(date);
    }

    /**
     * 依据格式获取当前时间
     * 
     * @param format
     * @return
     */
    public static String getNow(String format) {
        return getNow(new SimpleDateFormat(format));
    }

    /**
     * 日期计算
     * 
     * @param day
     * @return
     */
    public static String addDays(int day) {
        Calendar right = Calendar.getInstance();
        right.add(Calendar.DAY_OF_MONTH, day);
        Date date = right.getTime();
        return longSimpleDateFormat.format(date);
    }

    /**
     * 自定义日期格式的日期计算
     * 
     * @param day
     * @param format
     * @return
     */
    public static String addDays(int day, String format) {
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        Calendar right = Calendar.getInstance();
        right.add(Calendar.DAY_OF_MONTH, day);
        Date date = right.getTime();
        return formatter.format(date);
    }
}
