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

/**
 * @author 枫铃也
 * @since 2019-10-09 13:51
 */
public class DateUtil {

    private static final TimeZone TIME_ZONE = TimeZone.getDefault();
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static String format(Date date) {
        return DATE_FORMAT.format(date);
    }

    /**
     * <p>@description: 得到当前日历 </p>
     * <p>@method: getCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:47 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getCalendar() {
        return Calendar.getInstance(TIME_ZONE);
    }

    /**
     * <p>@description: 得到当前秒的开始日历 </p>
     * <p>@method: getSecondStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getSecondStartCalendar() {
        Calendar calendar = getCalendar();
        //将毫秒至0
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar;
    }

    /**
     * <p>@description: 得到上一秒的开始日历 </p>
     * <p>@method: getLastSecondStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLastSecondStartCalendar() {
        Calendar calendar = getSecondStartCalendar();
        //将秒为上一秒
        calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 1);
        return calendar;
    }
    /**
     * <p>@description: 得到下一秒的开始日历 </p>
     * <p>@method: getLaterSecondStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLaterSecondStartCalendar() {
        Calendar calendar = getSecondStartCalendar();
        //将秒为下一秒
        calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) + 1);
        return calendar;
    }

    /**
     * <p>@description: 得到当前秒的结束日历 </p>
     * <p>@method: getSecondEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getSecondEndCalendar() {
        Calendar calendar = getCalendar();
        //将毫秒至999
        calendar.set(Calendar.MILLISECOND, 999);
        return calendar;
    }

    /**
     * <p>@description: 得到上一秒的结束日历 </p>
     * <p>@method: getLastSecondEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLastSecondEndCalendar() {
        Calendar calendar = getSecondEndCalendar();
        //将秒置上一秒
        calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 1);
        return calendar;
    }

    /**
     * <p>@description: 得到下一秒的结束日历 </p>
     * <p>@method: getLaterSecondEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLaterSecondEndCalendar() {
        Calendar calendar = getSecondEndCalendar();
        //将秒置下一秒
        calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) + 1);
        return calendar;
    }

    /**
     * <p>@description: 得到当前分钟的开始日历 </p>
     * <p>@method: getMinuteStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getMinuteStartCalendar() {
        Calendar calendar = getSecondStartCalendar();
        //将秒至0
        calendar.set(Calendar.SECOND, 0);
        return calendar;
    }

    /**
     * <p>@description: 得到上一分钟的开始日历 </p>
     * <p>@method: getLastMinuteStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLastMinuteStartCalendar() {
        Calendar calendar = getMinuteStartCalendar();
        //将分钟置上一分钟
        calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) - 1);
        return calendar;
    }
    /**
     * <p>@description: 得到下一分钟的开始日历 </p>
     * <p>@method: getLaterMinuteStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLaterMinuteStartCalendar() {
        Calendar calendar = getMinuteStartCalendar();
        //将分钟置下一分钟
        calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) + 1);
        return calendar;
    }

    /**
     * <p>@description: 得到当前分钟的结束日历 </p>
     * <p>@method: getMinuteEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getMinuteEndCalendar() {
        Calendar calendar = getSecondEndCalendar();
        //将秒至59
        calendar.set(Calendar.SECOND, 59);
        return calendar;
    }

    /**
     * <p>@description: 得到上一分钟的结束日历 </p>
     * <p>@method: getLastMinuteEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLastMinuteEndCalendar() {
        Calendar calendar = getMinuteEndCalendar();
        //将分钟为上一分钟
        calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) - 1);
        return calendar;
    }

    /**
     * <p>@description: 得到下一分钟的结束日历 </p>
     * <p>@method: getLaterMinuteEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLaterMinuteEndCalendar() {
        Calendar calendar = getMinuteEndCalendar();
        //将分钟为下一分钟
        calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) + 1);
        return calendar;
    }

    /**
     * <p>@description: 得到当前小时的开始日历 </p>
     * <p>@method: getHourStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getHourStartCalendar() {
        Calendar calendar = getMinuteStartCalendar();
        //将分钟置0
        calendar.set(Calendar.MINUTE, 0);
        return calendar;
    }

    /**
     * <p>@description: 得到上一小时的开始日历 </p>
     * <p>@method: getLastHourStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLastHourStartCalendar() {
        Calendar calendar = getHourStartCalendar();
        //将小时置上一小时
        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - 1);
        return calendar;
    }
    /**
     * <p>@description: 得到下一小时的开始日历 </p>
     * <p>@method: getLaterHourStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLaterHourStartCalendar() {
        Calendar calendar = getHourStartCalendar();
        //将小时置下一小时
        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) + 1);
        return calendar;
    }

    /**
     * <p>@description: 得到当前小时的结束日历 </p>
     * <p>@method: getHourEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getHourEndCalendar() {
        Calendar calendar = getMinuteEndCalendar();
        //将分钟置59
        calendar.set(Calendar.MINUTE, 59);
        return calendar;
    }

    /**
     * <p>@description: 得到上一小时的结束日历 </p>
     * <p>@method: getLastHourEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLastHourEndCalendar() {
        Calendar calendar = getHourEndCalendar();
        //将小时置上一小时
        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - 1);
        return calendar;
    }
    /**
     * <p>@description: 得到下一小时的结束日历 </p>
     * <p>@method: getLaterHourEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLaterHourEndCalendar() {
        Calendar calendar = getHourEndCalendar();
        //将小时置下一小时
        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) + 1);
        return calendar;
    }

    /**
     * <p>@description: 得到当前日的开始日历 </p>
     * <p>@method: getDayStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getDayStartCalendar() {
        Calendar calendar = getHourStartCalendar();
        //将小时置0
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        return calendar;
    }

    /**
     * <p>@description: 得到前一天的开始日历 </p>
     * <p>@method: getLastDayStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLastDayStartCalendar() {
        Calendar calendar = getHourStartCalendar();
        //将日设置为前一天
        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - 1);
        return calendar;
    }

    /**
     * <p>@description: 得到后一天的开始日历 </p>
     * <p>@method: getLaterDayStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLaterDayStartCalendar() {
        Calendar calendar = getHourStartCalendar();
        //将日设置为后一天
        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) + 1);
        return calendar;
    }

    /**
     * <p>@description: 得到当前日的结束日历 </p>
     * <p>@method: getDayEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getDayEndCalendar() {
        Calendar calendar = getHourEndCalendar();
        //将小时置23
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        return calendar;
    }

    /**
     * <p>@description: 得到前一日的结束日历 </p>
     * <p>@method: getLastDayEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLastDayEndCalendar() {
        Calendar calendar = getDayEndCalendar();
        //将日置前一日
        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - 1);
        return calendar;
    }

    /**
     * <p>@description: 得到后一日的结束日历 </p>
     * <p>@method: getLaterDayEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLaterDayEndCalendar() {
        Calendar calendar = getDayEndCalendar();
        //将日置后一日
        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) + 1);
        return calendar;
    }

    /**
     * <p>@description: 得到当前月的开始日历 </p>
     * <p>@method: getMonthStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getMonthStartCalendar() {
        Calendar calendar = getDayStartCalendar();
        //设置为1号
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return calendar;
    }

    /**
     * <p>@description: 得到上个月的开始日历 </p>
     * <p>@method: getLastMonthStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLastMonthStartCalendar() {
        Calendar calendar = getMonthStartCalendar();
        //设置月为上一月
        calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
        return calendar;
    }

    /**
     * <p>@description: 得到下个月的开始日历 </p>
     * <p>@method: getLaterMonthStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLaterMonthStartCalendar() {
        Calendar calendar = getMonthStartCalendar();
        //设置月为下一月
        calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
        return calendar;
    }

    /**
     * <p>@description: 得到当前月的结束日历 </p>
     * <p>@method: getMonthEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getMonthEndCalendar() {
        Calendar calendar = getDayEndCalendar();
        //设置为最后一天
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return calendar;
    }

    /**
     * <p>@description: 得到上一月的结束日历 </p>
     * <p>@method: getLastMonthEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLastMonthEndCalendar() {
        Calendar calendar = getMonthEndCalendar();
        //设置月为上一月
        calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
        return calendar;
    }

    /**
     * <p>@description: 得到下个月的结束日历 </p>
     * <p>@method: getLaterMonthEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLaterMonthEndCalendar() {
        Calendar calendar = getMonthEndCalendar();
        //设置月为下个月
        calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
        return calendar;
    }

    /**
     * <p>@description: 得到当前年的开始日历 </p>
     * <p>@method: getYearStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getYearStartCalendar() {
        Calendar calendar = getMonthStartCalendar();
        //设置月为1月
        calendar.set(Calendar.MONTH, 0);
        return calendar;
    }

    /**
     * <p>@description: 得到前一年的开始日历 </p>
     * <p>@method: getLastYearStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLastYearStartCalendar() {
        Calendar calendar = getYearStartCalendar();
        //设置年份为前一年
        calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) - 1);
        return calendar;
    }

    /**
     * <p>@description: 得到后一年的开始日历 </p>
     * <p>@method: getLaterYearStartCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLaterYearStartCalendar() {
        Calendar calendar = getYearStartCalendar();
        //设置年份为后一年
        calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + 1);
        return calendar;
    }

    /**
     * <p>@description: 得到当前年的结束日历 </p>
     * <p>@method: getYearEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getYearEndCalendar() {
        Calendar calendar = getMonthEndCalendar();
        //设置月为12月
        calendar.set(Calendar.MONTH, 11);
        //设置为31号
        calendar.set(Calendar.DAY_OF_MONTH, 31);
        return calendar;
    }

    /**
     * <p>@description: 得到上一年的结束日历 </p>
     * <p>@method: getLastYearEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLastYearEndCalendar() {
        Calendar calendar = getYearEndCalendar();
        //设置年为前一年
        calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) - 1);
        return calendar;
    }

    /**
     * <p>@description: 得到后一年的结束日历 </p>
     * <p>@method: getLaterYearEndCalendar </p>
     * <p>@author: 枫铃也 </p>
     * <p>@since: 2019-10-09 14:48 </p>
     *
     * <p>@return java.util.Calendar </p>
     */
    public static Calendar getLaterYearEndCalendar() {
        Calendar calendar = getYearEndCalendar();
        //设置年为后一年
        calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + 1);
        return calendar;
    }

    public static void main(String[] args) {
        System.out.println("明年的开始:" + DateUtil.format(getLaterYearStartCalendar().getTime()));
        System.out.println("明年的结束:" + DateUtil.format(getLaterYearEndCalendar().getTime()));
        System.out.println("今年的开始:" + DateUtil.format(getYearStartCalendar().getTime()));
        System.out.println("今年的结束:" + DateUtil.format(getYearEndCalendar().getTime()));
        System.out.println("去年的开始:" + DateUtil.format(getLastYearStartCalendar().getTime()));
        System.out.println("去年的结束:" + DateUtil.format(getLastYearEndCalendar().getTime()));
    }
}