package com.jiayue.ipp.idp.util;

//import com.sun.istack.internal.NotNull;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 时间工具类
 *
 * @author zzy
 * @version 1.0
 * @since 2019/8/2 13:09
 */
@SuppressWarnings("WeakerAccess")
public class DateTimeUtil {

    /**
     * 获取月份
     *
     * @param dateTime 时间，单位：毫秒
     * @return 月份
     */
    public static int getMonth(final Long dateTime) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(dateTime);
        return calendar.get(Calendar.MONTH) + 1;
    }

    /**
     * 获取指定时间在当天所处于的时刻(15分钟为一个时刻)
     * 例如：dateTime：2018-10-22 16:44:00
     * 从0点0分开始计算，0点0分-0点15为第一个时刻，依次类推该时间的时刻数为67
     *
     * @param dateTime 时间，单位：毫秒
     * @return 时刻
     */
    public static int getMomentFor15Minute(final Long dateTime) {
        return (int) ((dateTime - DateTimeUtil.getDayStartTime(dateTime).getTime()) / (15 * 60 * 1000)) + 1;
    }

    /**
     * 获取指定时间在当天所处于的时刻(5分钟为一个时刻)
     * 例如：dateTime：2018-10-22 01:44:00
     * 从0点0分开始计算，0点0分-0点5为第一个时刻，依次类推该时间的时刻数为
     *
     * @param dateTime 时间，单位：毫秒
     * @return 时刻
     */
    public static int getMomentFor5Minute(final Long dateTime) {
        return (int) ((dateTime - DateTimeUtil.getDayStartTime(dateTime).getTime()) / (5 * 60 * 1000)) + 1;
    }

    /**
     * 获取指定时间所在时刻的标记时间(15分钟为一个时刻)<br>
     * 例如：dateTime:2018-10-22 16:44:00 <br>
     * 标记时间为2018-10-22 16:30:00
     *
     * @param dateTime 时间，单位：毫秒
     * @return 指定时间所在时刻的标记时间，单位：毫秒
     */
    public static Date getMomentTimeFor15Minute(final Long dateTime) {
        int moment = DateTimeUtil.getMomentFor15Minute(dateTime);// 获取指定时间所在时刻数
        long differentTime = moment * 15 * 60 * 1000;// 获取从0分0秒开始到现在的时间间隔，单位：毫秒
        long dayStartTime = DateTimeUtil.getDayStartTime(dateTime).getTime();
        return new Date(dayStartTime + differentTime - 15 * 60 * 1000);
    }

    /**
     * 获取指定时间所在时刻的标记时间(5分钟为一个时刻)<br>
     * 例如：dateTime:2018-10-22 16:44:00 <br>
     * 标记时间为2018-10-22 16:40:00
     *
     * @param dateTime 时间，单位：毫秒
     * @return 指定时间所在时刻的标记时间，单位：毫秒
     */
    public static Date getMomentTimeFor5Minute(final Long dateTime) {
        int moment = DateTimeUtil.getMomentFor15Minute(dateTime);// 获取指定时间所在时刻数
        long differentTime = moment * 5 * 60 * 1000;// 获取从0分0秒开始到现在的时间间隔，单位：毫秒
        long dayStartTime = DateTimeUtil.getDayStartTime(dateTime).getTime();
        return new Date(dayStartTime + differentTime - 5 * 60 * 1000);
    }

    /**
     * 获取当前时间（时间粒度分钟）
     *
     * @return 当前时间
     */
    public static Date getCurrentTimeForMinute() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }

    /**
     * 获取指定时间所在天的0点0分
     *
     * @param dateTime 时间毫秒
     * @return 0点0分的毫秒
     */
    public static Date getDayStartTime(final Long dateTime) {
        Calendar date = Calendar.getInstance();
        date.setTimeInMillis(dateTime);
        date.set(Calendar.HOUR_OF_DAY, 0);
        date.set(Calendar.MINUTE, 0);
        date.set(Calendar.SECOND, 0);
        date.set(Calendar.MILLISECOND, 0);
        return date.getTime();
    }
//
//    /**
//     * 今日凌晨 毫秒
//     *
//     * @return 时间
//     */
//    public static long getMillisecondsSubDay() {
//
//        Calendar c = Calendar.getInstance();
//
//        return c.getTimeInMillis() - DateUtils.getFragmentInMilliseconds(c, Calendar.DAY_OF_MONTH);
//    }

    /**
     * 获取指定时间所在天的23点59分59秒
     *
     * @param dateTime 时间毫秒
     * @return 23点59分59秒的毫秒
     */
    public static Date getDayLastTime(final Long dateTime) {
        Calendar date = Calendar.getInstance();
        date.setTimeInMillis(dateTime);
        date.set(Calendar.HOUR_OF_DAY, 23);
        date.set(Calendar.MINUTE, 59);
        date.set(Calendar.SECOND, 59);
        date.set(Calendar.MILLISECOND, 999);
        return date.getTime();
    }

    /**
     * 获取两个时间间的间隔天数(自然天)
     *
     * @param dateFrom 开始时间
     * @param dateTo   结束时间
     * @return 自然天数
     */
    public static int getDaysBetweenTwoDate(Long dateFrom, Long dateTo) {
        return (int) ((DateTimeUtil.getDayStartTime(dateTo).getTime() - DateTimeUtil.getDayStartTime(dateFrom).getTime()) / (1000 * 60 * 60 * 24L));
    }

    /**
     * 获取两个时间间的间隔间隔时刻数(15分钟一个时刻)
     *
     * @param dateFrom 开始时间
     * @param dateTo   结束时间
     * @return 间隔时刻数
     */
    public static int getMomentsBetweenTwoDate(Long dateFrom, Long dateTo) {
        return (int) ((dateTo - dateFrom) / (15 * 60 * 1000));
    }


    /**
     * 获取现在时间
     *
     * @return 返回字符串格式 yyyy-MM-dd HH:mm:ss
     */
    public static String getStringDate() {
        Date currentTime = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = formatter.format(currentTime);
        return dateString;
    }

    /**
     * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm:ss
     *
     * @param dateDate
     * @return
     */
    public static String dateToStrLong(Date dateDate) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = formatter.format(dateDate);
        return dateString;
    }

    /**
     * 将时间格式字符串转换为时间 HH:mm
     *
     * @param strDate
     * @return
     */
    public static Date strToDateLongHM(String strDate) {
        SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
        ParsePosition pos = new ParsePosition(0);
        Date strtodate = formatter.parse(strDate, pos);
        return strtodate;
    }

    /**
     * 判断时间是不是今天
     * @param date
     * @return    是返回true，不是返回false
     */
    public static boolean isNow(Date date) {
        //当前时间
        Date now = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
        //获取今天的日期
        String nowDay = sf.format(now);
        //对比的时间
        String day = sf.format(date);
        return day.equals(nowDay);
    }

}
