/**
  * 日期时间工具类
  *
  * @author L
  */
object DateUtils {
  val DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd")
  val DATE_KEY_FORMAT = new SimpleDateFormat("yyyyMMdd")
  val TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  val TIME_MINUTE_FORMAT = new SimpleDateFormat("yyyyMMddHHmm")
  val GMT_FORMAT = new SimpleDateFormat("dd/MMM/yyyy hh:mm:ss", Locale.ENGLISH)

  /**
    * 获取当天日期 格式:yyyy-MM-dd
    *
    * @return 当天日期
    */
  def getTodayDate: String = {
    DATE_FORMAT.format(new Date)
  }

  /**
    * 获取昨天日期 格式:yyyy-MM-dd
    *
    * @return 昨天日期
    */
  def getYesterdayDate: String = {
    val cal = Calendar.getInstance
    cal.setTime(new Date)
    cal.add(Calendar.DATE, -1)
    DATE_FORMAT.format(cal.getTime)
  }

  /** 获取日期时间 格式:yyyy-MM-dd HH:mm:ss
    *
    * @param i :  当天为0,前一天为-1,后一天为1
    * @return yyyy-MM-dd  HH:mm:ss
    */
  def getDate(i: Int): String = {
    val cal = Calendar.getInstance
    cal.setTime(new Date)
    cal.add(Calendar.DATE, i)
    TIME_FORMAT.format(cal.getTimeInMillis)
  }

  /**
    * 格式化日期 date转日期
    *
    * @param date Date对象 Sat Sep 07 03:02:01 CST 2019
    * @return yyyy-MM-dd
    */
  def formatDate(date: Date): String = DATE_FORMAT.format(date)

  /**
    * 格式化日期 时间戳转日期
    *
    * @param timestamp 时间戳
    * @return yyyy-MM-dd
    */
  def formatDate(timestamp: Timestamp): String = DATE_FORMAT.format(timestamp * 1000)

  /**
    * 格式化日期 string转日期
    *
    * @param date "yyyy-MM-dd HH:mm:ss"
    * @return yyyy-MM-dd
    */
  def formatDate(date: String): String = DATE_FORMAT.format(DATE_FORMAT.parse(date))

  /**
    * 格式化时间 date对象转时间
    *
    * @param date Date对象 Sat Sep 07 03:02:01 CST 2019
    * @return yyyy-MM-dd HH:mm:ss
    */
  def formatTime(date: Date): String = TIME_FORMAT.format(date)


  /**
    * 格式化日期 date转yyyyMMdd日期
    *
    * @param date yyyy-MM-dd HH:mm:ss
    * @return yyyyMMdd
    */
  def formatKeyDate(date: Date): String = DATE_KEY_FORMAT.format(date)

  /**
    * 格式化日期 date string转yyyyMMdd日期,没有-间隔
    *
    * @param date "yyyy-MM-dd HH:mm:ss"
    * @return yyyyMMdd
    */
  def formatKeyDate(date: String): String = DATE_KEY_FORMAT.format(TIME_FORMAT.parse(date))

  /**
    * 将GMT日期格式转换为时间戳
    *
    * @param gmt 07/Sep/2019:00:07:39 +0800
    * @return timestamp
    */
  def formatGmtToTimestamp(gmt: String): Long = GMT_FORMAT.parse(gmt).getTime

  /**
    * 格式化时间戳 date string转时间戳
    *
    * @param date "yyyy-MM-dd HH:mm:ss"
    * @return timestamp
    */
  def formatDateToTimestamp(date: String): Long = DATE_FORMAT.parse(date).getTime

  /**
    * 将CMT日期格式转换为时间
    *
    * @param gmt 07/Sep/2019:00:07:39 +0800
    * @return yyyy-MM-dd HH:mm:ss
    */
  def formatGmtToTime(gmt: String): String = TIME_FORMAT.format(gmt)

  /**
    * 格式化时间 保留到分钟级
    *
    * @param date
    * @return yyyyMMddHHmm
    */
  def formatTimeMinute(date: Date): String = TIME_MINUTE_FORMAT.format(date)

  /**
    * 将时间格式化为0 时整的时间
    *
    * @param date yyyy-MM-dd HH:mm:ss
    * @return yyyy-MM-dd 00:00:00
    */
  def formatTimeZone(date: String): String = {
    val time = DATE_FORMAT.parse(date).getTime
    formatDate(time)
  }

  /**
    * 将时间转换为日期格式,格式化到月
    *
    * @param date yyyy-MM-dd HH:mm:ss
    * @return yyyy-MM
    */
  def formatDateToMonth(date: String): String = {
    val sdf = new SimpleDateFormat("yyyy-MM")
    sdf.format(TIME_FORMAT.parse(date))
  }

  /**
    * 获取小时
    *
    * @param date yyyy-MM-dd HH:mm:ss
    * @return HH
    */
  def formatHour(date: String): String = {
    val sdf = new SimpleDateFormat("HH")
    sdf.format(TIME_FORMAT.parse(date))
  }
}