package cn.util.time;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import cn.constant.TimeFormat;
import cn.util.core.IsKit;
import cn.util.core.LogKit;

public class TimeKit 
{
	public static LocalDateTime getNowLocalDateTime()
	{
		return dateToLocalDateTime(new Date());
	}
	/**
	 * String("yyyy-MM-dd HH:mm:ss")转换为 LocalDateTime
	 */
	public static LocalDateTime dateToLocalDateTime(final String strLocalTime)
	{
		DateTimeFormatter df = DateTimeFormatter.ofPattern(TimeFormat.YYYY_MM_DD_HH_MM_SS);
		return LocalDateTime.parse(strLocalTime,df);
	}

	/**
	 * 日期转为LocalDateTime 待验证
	 * @param date 日期
	 * @return LocalDateTime
	 */
	public static LocalDateTime dateToLocalDateTime(final Date date) {
		if (IsKit.isNull(date)) {
			return null;
		}
		final Instant instant = date.toInstant();
		final ZoneId zoneId = ZoneId.systemDefault();
		final LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
		return localDateTime;
	}
	/**
	 * LocalDate转为日期  待验证
	 * @param localDate
	 * @return
	 */
	public static Date localDateToDate(final LocalDate localDate) {
		if (IsKit.isNull(localDate)) {
			return null;
		}
		final ZoneId zoneId = ZoneId.systemDefault();
		final ZonedDateTime zdt = localDate.atStartOfDay().atZone(zoneId);
		final Date date = Date.from(zdt.toInstant());
		return date;
	}


	///////////////////////////////////////
	/**当前日期，格式 yyyy-MM-dd*/
	public static String getToday() {
		return (TimeFormat.SDF_YYYY_MM_DD).format(new Date());
	}
	/** 
	 * 计算两个时间之间的天数 
	 */
	public static Long daysBetweenTwoDate(String startDate, String endDate) {
		Long num = 0L;
		try {
			Date start = (TimeFormat.SDF_YYYY_MM_DD).parse(startDate);
			Date endDay = (TimeFormat.SDF_YYYY_MM_DD).parse(endDate);
			Long starTime = start.getTime();
			Long endTime=endDay.getTime();
			//时间戳相差的毫秒数
			num=endTime-starTime;
		} catch (ParseException e) {}
		return num/24/60/60/1000;
	}

	/**
	 * 日期路径 即年/月/日 如2018/08/08
	 */
	public static final String datePath() {
		Date now = new Date();
		return DateFormatUtils.format(now, "yyyy/MM/dd");
	}


	/**获取当前Date型日期 */
	public static Date getNowDate() {
		return new Date();
	}

	public static final String parseDateToStr(final String format, final Date date) {
		return new SimpleDateFormat(format).format(date);
	}

	/**
	 * 计算两个时间差
	 */
	public static String getDateDiff(Date endDate, Date nowDate) {
		long nd = 1000 * 24 * 60 * 60;
		long nh = 1000 * 60 * 60;
		long nm = 1000 * 60;
		// long ns = 1000;
		// 获得两个时间的毫秒时间差异
		long diff = endDate.getTime() - nowDate.getTime();
		// 计算差多少天
		long day = diff / nd;
		// 计算差多少小时
		long hour = diff % nd / nh;
		// 计算差多少分钟
		long min = diff % nd % nh / nm;
		// 计算差多少秒//输出结果
		// long sec = diff % nd % nh % nm / ns;
		return day + "天" + hour + "小时" + min + "分钟";
	}


	/**
	 * 日期型字符串转化为日期 格式
	 */
	public static Date parseDate(Object str) {
		if (IsKit.isNull(str)) {
			return null;
		}
		try {
			return DateUtils.parseDate(str.toString(), TimeFormat.parsePatterns);
		} catch (ParseException e) {
			return null;
		}
	}


	/**毫秒表示的时间: 1609138416836 */
	public static Long getTimesLong(){
		return  System.currentTimeMillis();
	}



	 /**获取yyyy-MM-dd HH:mm:ss格式 */
	public static String getTimesStr(){
		return (TimeFormat.SDF_YYYYMMDDHMS).format(new Date());
	}

	/**获取YYYY-MM-DD_HH:mm:ss格式 */
	public static String getNowHMS() {
		return (TimeFormat.SDF_YYYY_MM_DD_HMS).format(new Date());
	}


	/**
	 * 按照参数format的格式，日期转字符串
	 * @param date
	 * @param format
	 * @return
	 */
	public static String dateToStr(Date date,String format){
		if(IsKit.isNotNull(format)){
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			return sdf.format(date);
		}else{
			return "";
		}
	}

	/**
	 * 按照yyyy-MM-dd HH:mm:ss的格式，日期转字符串
	 * @param date
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public static String dateToStr(Date date){
		return dateToStr(date,TimeFormat.YYYY_MM_DD_HH_MM_SS);
	}

	/**默认时区的系统时钟中获取LocalDateTime.now()2019-02-18T06:04:31.369
	 * Mysql的Datetime类型支持到微秒
	 * 
	 * @param time (含有T Z)的UTC时间（世界标准时间）
	 * @return 返回时间字符串Timestamp 格式：yyyy-MM-dd HH:mm:ss
	 */
	public static String UTCToTimestamp(LocalDateTime time) 
	{
		return DateTimeFormatter.ofPattern(TimeFormat.YYYY_MM_DD_HH_MM_SS).format(time);
	}
	//UTC("2014-08-23T09:20:05Z")时间字符串转换成Timestamp格式的日期(2015-05-28 18:22:48)
	public static String UTCToTimestampStr(String time) 
	{	//UTC是本地时间
		time = time.replace("Z", " UTC");
		Date d = null;
		try {
			d = TimeFormat.UTC2.parse(time);
			return TimeFormat.SDF_YYYYMMDDHMS.format(d);
		} catch (ParseException e) {
		}
		return time;
	}
	//默认返回当前时间
	public static Date UTCToTimestamp(String time) 
	{	//UTC是本地时间
		time = time.replace("Z", " UTC");
		Date d = null;
		try {
			d = TimeFormat.UTC2.parse(time);
			return d ;
		} catch (ParseException e) {
		}
		return new Date();
	}

	/** 格式化日期 */
	public static Date fomatDateTime(String date) {
		try {
			return (TimeFormat.SDF_YYYYMMDDHMS).parse(date);
		} catch (Exception e) {
			LogKit.info(e);
			return null;
		}
	}
	//将Java date转化为 数据库Date
	public static java.sql.Timestamp dateToTimestamp(java.util.Date date) {
		if (IsKit.isNull(date)) {
			return null;
		}
		return new java.sql.Timestamp(date.getTime());
	}


	/** 格式化日期 */
	public Date fomatDate(String date) {
		try {
			return (TimeFormat.SDF_YYYY_MM_DD).parse(date);
		} catch (Exception e) {
			LogKit.info(e);
			return null;
		}
	}
	/**获取YYYY-MM-DD HH:mm:ss格式 */
	public static String getNow() {
		return (TimeFormat.SDF_YYYYMMDDHMS).format(new Date());
	}

	/**含有T的字符串转LocalDateTime*/
	public static LocalDateTime toLocalDateTime(Object obj)
	{
		LocalDateTime localDateTime = null;
		if(obj instanceof java.sql.Timestamp){
			localDateTime = ((Timestamp) obj).toLocalDateTime();
		}
		if(obj instanceof java.time.LocalDateTime){
			localDateTime = (LocalDateTime)obj;
		}
		return localDateTime;
	}


}
