/*
 * File_Name DateUtils.java 2018年5月29日
 * version 
 * copyright (c)2018 Asiainfo Network Security Group Security Innovative Operation Dept. All rights reserved.
 */
package com.bootdo.datas.tools;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**.
 * 详细介绍类情况.
 * @author wangp
 * @since 2018年5月29日
 * @see
 */
public class DateUtils {

    /**.
     * log4j日志
     */
    private static Logger log = LoggerFactory.getLogger(DateUtils.class);

    //年月日
    private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

    //月
    private final static SimpleDateFormat sdfMon = new SimpleDateFormat("MM");

    //天
    private final static SimpleDateFormat sdfDay = new SimpleDateFormat("dd");

    //月 日
    private final static SimpleDateFormat sdfMMdd = new SimpleDateFormat("MMdd");

    //时分
    private final static SimpleDateFormat sdfHHMM = new SimpleDateFormat("HHmm");

    //年月日时分秒
    private final static SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMddHHmmss");

    //年月日时分秒
    private final static SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    //年月日时分
    private final static SimpleDateFormat sdfYYmmddHHMM = new SimpleDateFormat("yyyy-MM-dd HH:mm");

    //年月日
    private final static SimpleDateFormat sdfYYmmddd = new SimpleDateFormat("yyyy-MM-dd");

    //时分
    private final static SimpleDateFormat sdfHHMMM = new SimpleDateFormat("HH:mm");

    //年月日时分秒 毫秒
    private final static SimpleDateFormat sdf3 = new SimpleDateFormat("yyyyMMddHHmmssSSS");

    //年月带符号
    private final static SimpleDateFormat sdfYYMM = new SimpleDateFormat("yyyy/MM");

    //年
    private final static SimpleDateFormat sdfYY = new SimpleDateFormat("yyyy");

    //年月不带符号
    private final static SimpleDateFormat sdfYYmm = new SimpleDateFormat("yyyyMM");

    //年月日不带符号
    private final static SimpleDateFormat sdfYYmmdd = new SimpleDateFormat("yyyyMMdd");

    //零点零分标识
    private static String timeHM = "0000";

    //年月日时
    private final static SimpleDateFormat sdfYYmmddhh = new SimpleDateFormat("yyyyMMddHH");

    /**
     * 格式化指定日期.
     * 详细描述函数的实现过程.
     * @author wangp
     * @since 2018年5月29日
     * @parameters @param format
     * @parameters @param date
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String formatDate(String format, Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * @Description:
     * @Author: wangp
     * @Date: 2021/12/8 21:41
     * @param date
     * @Return: String
     */
    public static String getFormatTimeString(Date date) {
        SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        return sDateFormat.format(date);
    }

    /**
     * .
     * 上周开始时间.
     * @author wangp
     * @since 2018年5月29日
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getLastWeekBeginDate() {
        Calendar calendar = Calendar.getInstance();
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        int offset = 1 - dayOfWeek;
        calendar.add(Calendar.DATE, offset - 7);
        String lastWeekBeginDate = sdf.format(calendar.getTime());
        log.info("lastWeekBeginDate:" + lastWeekBeginDate);
        return lastWeekBeginDate;
    }

    /**
     * .
     * 上周结束日期.
     * @author wangp
     * @since 2018年5月29日
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getLastWeekEndDate() {
        Calendar calendar = Calendar.getInstance();
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        int offset = 7 - dayOfWeek;
        calendar.add(Calendar.DATE, offset - 7);
        String lastWeekEndDate = sdf.format(calendar.getTime());
        log.info("lastWeekEndDate:" + lastWeekEndDate);
        return lastWeekEndDate;
    }

    /**
     * .
     * 获取日表名称 today.
     * @author wangp
     * @since 2018年6月11日
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getTableName() {
        String time = DateUtils.getTimesHM();
        Calendar cal = Calendar.getInstance();
        if (timeHM.equals(time)) {
            cal.add(Calendar.DATE, -1);
        }
        else {
            cal.add(Calendar.DATE, -0);
        }

        Map<String, String> map = new HashMap<String, String>();
        String monDay = sdfMMdd.format(cal.getTime());//月数天数
        return monDay;
    }

    /**
     * .
     * 获取日表名称 （today/yesterday）.
     * @author wangp
     * @since 2018年6月11日
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getTableNameForToday() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -0);
        Map<String, String> map = new HashMap<String, String>();
        String monDay = sdfMMdd.format(cal.getTime());//月数天数
        return monDay;
    }

    /**
     * .
     * 获取月份 today.
     * @author wangp
     * @since 2018年6月11日
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getMonForToday() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -0);
        String tableDay = sdfMon.format(cal.getTime());//月份
        return tableDay;
    }

    /**
     * .
     * 获取天数 today.
     * @author wangp
     * @since 2018年6月11日
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getDayForToday() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -0);
        String today = sdfDay.format(cal.getTime());//天数
        return today;
    }

    /**
     * .
     * 获取年月日时分秒.
     * @author wangp
     * @since 2018年6月11日
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getTimes() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -0);
        String times = sdf2.format(cal.getTime());//天数
        return times;
    }

    /**
     * .
     * 获取年月日时分秒.
     * @author wangp
     * @since 2018年6月11日
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getTimeInfo(int time) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MINUTE, -time);
        String times = sdf4.format(cal.getTime());//天数
        return times;
    }

    /**
     * .
     * 当前时分 获取.
     * @author wangp
     * @since 2018年10月19日
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getTimesHM() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -0);
        String times = sdfHHMM.format(cal.getTime());//时分
        return times;
    }

    /**
     *  获取1天之前的1小时后的年月日时分.
     * @author sunhn
     * @since 2018年11月16日
     * @parameters @param minute
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */

    public static String getafterHourForN() {

        Calendar calbefore7 = Calendar.getInstance();

        calbefore7.add(Calendar.DAY_OF_MONTH, -1);
        calbefore7.add(Calendar.HOUR_OF_DAY, +1);
        String endTimes = sdfYYmmddHHMM.format(calbefore7.getTime());
        return endTimes;
    }

    /**
     * .
     * 5分钟前 获取年月日时分.
     * @author sunhn
     * @since 2018年11月28日
     * @parameters @param minute
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getbeforeFiveMin() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MINUTE, -5);
        String times = sdfYYmmddHHMM.format(cal.getTime());
        return times;
    }

    /**
     * .
     *  获取当前年月日时分.
     * @author sunhn
     * @since 2018年11月28日
     * @parameters @param minute
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getTime() {
        Calendar cal = Calendar.getInstance();
        String times = sdfYYmmddHHMM.format(cal.getTime());
        return times;
    }

    /**
     * .
     * 5分钟前 获取年月日时分.
     * @author sunhn
     * @since 2018年11月28日
     * @parameters @param minute
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getHourMinbeforeFiveMin() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MINUTE, -5);
        String times = sdfHHMMM.format(cal.getTime());
        return times;
    }

    /**
     * .
     *  获取当前时分.
     * @author sunhn
     * @since 2018年11月28日
     * @parameters @param minute
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getHourMin() {
        Calendar cal = Calendar.getInstance();
        String times = sdfHHMMM.format(cal.getTime());
        return times;
    }

    /**
     * 
     *  获取1天之前的当前年月日时分.
     * @author sunhn
     * @since 2018年11月16日
     * @parameters @param minute
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getbeforeDayForN() {
        Calendar calbefore1 = Calendar.getInstance();

        calbefore1.add(Calendar.DAY_OF_MONTH, -1);
        String endTimes = sdfYYmmddHHMM.format(calbefore1.getTime());
        return endTimes;
    }

    /**
     * 
     *  获取1天之前的当前年月日.
     * @author sunhn
     * @since 2018年11月16日
     * @parameters @param minute
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getbeforeDayForOne() {
        Calendar calbefore1 = Calendar.getInstance();

        calbefore1.add(Calendar.DAY_OF_MONTH, -1);
        String endTimes = sdfYYmmddd.format(calbefore1.getTime());
        return endTimes;
    }

    /**
     * 
     *  获取7天之前的当前年月日.
     * @author sunhn
     * @since 2018年11月16日
     * @parameters @param minute
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getbeforeDayForSeven() {
        Calendar calbefore7 = Calendar.getInstance();

        calbefore7.add(Calendar.DAY_OF_MONTH, -7);
        String endTimes = sdfYYmmddd.format(calbefore7.getTime());
        return endTimes;
    }

    /**
     * .
     * n分钟前 获取年月日时分秒.
     * @author wangp
     * @since 2018年6月11日
     * @parameters @param minute
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getminForN(int minute) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MINUTE, -30);
        String times = sdf2.format(cal.getTime());//天数
        return times;
    }

    /**
     * .
     * 获取年月日时分秒 毫秒.
     * @author wangp
     * @since 2018年6月11日
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getTimeMS() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -0);
        String times = sdf3.format(cal.getTime());//天数
        return times;
    }

    /**
     * 获取年月名称.
     * @author zhenghj
     * @since 2018/8/30
     * @returns 返回说明
     * @throws
     */
    public static String getYearMonthName() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -0);
        String times = sdfYYMM.format(cal.getTime());//天数
        return times;
    }

    /**
     * 获取年名称.
     * @author zhenghj
     * @since 2018/8/30
     * @returns 返回说明
     * @throws
     */
    public static String getYearName() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -0);
        String times = sdfYY.format(cal.getTime());//天数
        return times;
    }

    /**
     * 获取年名日称.
     * @author zhenghj
     * @since 2018/8/30
     * @returns 返回
     * @throws
     */
    public static String getYearMonthDay() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -0);
        String times = sdf.format(cal.getTime());//天数
        return times;
    }

    /**
     * 获取年月名称,不带符号
     * @author zhenghj
     * @since 2018/8/30
     * @returns 返回
     * @throws
     */
    public static String getNotYearMonth() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -0);
        String times = sdfYYmm.format(cal.getTime());//天数
        return times;
    }

    /**
     * 获取年名日称,不带符号
     * @author zhenghj
     * @since 2018/8/30
     * @returns 返回
     * @throws
     */
    public static String getNotYearMonthDay() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -0);
        String times = sdfYYmmdd.format(cal.getTime());//天数
        return times;
    }

    /**
     * 获取上个月名称 按年月名称.
     * @author zhenghj
     * @since 2018/8/30
     * @returns 返回说明
     * @throws
     */
    public static String getLastYearMonthName() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, -1);
        String times = sdfYYMM.format(cal.getTime());//天数
        return times;
    }

    /**
     * 获取当前时间.
     * @author liuxb
     * @since 2018年11月19日
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getLocalTime() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -0);
        String times = sdf4.format(cal.getTime());//时分秒
        return times;
    }

    /**
     * .
     * 年月日时.
     * @author wangp
     * @since 2019年1月2日
     * @parameters @return 参数说明
     * @returns  返回说明
     * @throws
     */
    public static String getYMDH() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -0);
        String times = sdfYYmmddhh.format(cal.getTime());//年月日时
        return times;
    }

    //测试
    public static void main(String[] args) throws Exception {
        System.out.println("年月日时:" + DateUtils.getYMDH());
    }

}
