根据UTC和经纬度计算当地年份、季节、时区等的时间类工具

object TimeUtils {

  def main(args: Array[String]): Unit = {

  }

  /**
    * 计算所在地区的时区
    * @param lon
    * @return
    */
  def getTimeZone(lon: Double): Int = {
    var time_zone = 0
    if (lon > 0) {
      if (lon > 7.5) {
        time_zone = ((lon - 7.5) / 15 + 1).toInt
      }
    } else if (lon < 0) {
      if (lon < -7.5) {
        time_zone = ((lon + 7.5) / 15 - 1).toInt
      }
    }
    (time_zone)
  }

  /**
    * 计算所在地区的年份
    * @param utc
    * @param lon
    * @return
    */
  def getLocalYear(utc: Int, lon: Double): String = {
    // yyyy-MM-dd HH:mm:ss
    val fm = new SimpleDateFormat("yyyy")
    val localtime = utc + getTimeZone(lon) * 3600
    val year = fm.format(new Date((localtime - 8 * 3600) * 1000l))
    year
  }

  /**
    * 计算所在地区的日期(时间戳形式)
    * @param utc
    * @param lon
    * @return
    */
  def getLocalTime(utc: Int, lon: Double): Int = {
    utc + getTimeZone(lon) * 3600
  }


  /**
    * 获取所在地的季节
    *
    * @param utc
    * @param lon
    * @param lat
    * @return
    */
  def getLocalSeason(utc: Int, lon: Double, lat: Double): String = {

    // 获取所在地的年份
    val year = getLocalYear(utc, lon)

    // 获取本地时间(也就是所在时区的时间)
    val localTime = getLocalTime(utc, lon)
    var season = ""

    // 春分Spring Equinoxp夏至Summer Solstice,秋分Autumn Equinox冬至Winter Solstice
    // 当年的春分日期和春分日期对应的utc
    val springEquinoxp = TimeUtils.getYearDay(Integer.parseInt(year), 3, 21)
    val localSpring = getLocalTime(tranTimeToLong(springEquinoxp).toInt, lon)

    // 当年的夏至日期和夏至日期对应的utc
    val summerSolstice = TimeUtils.getYearDay(Integer.parseInt(year), 6, 21)
    val localSummer = tranTimeToLong(summerSolstice) + getTimeZone(utc) * 3600

    // 当年的秋分日期和秋分日期对应的utc
    val autumnEquinox = TimeUtils.getYearDay(Integer.parseInt(year), 9, 21)
    val localAutumn = tranTimeToLong(autumnEquinox) + getTimeZone(utc) * 3600

    // 当年的冬至日期和冬至日期对应的utc
    val winterSolstice = TimeUtils.getYearDay(Integer.parseInt(year), 12, 21)
    val localWinter = tranTimeToLong(winterSolstice) + getTimeZone(utc) * 3600

    // 北半球
    if (lat >= 0) {

      if (localTime >= localSpring && localTime < localSummer) {
        season = "spring"
      } else if (localTime >= localSummer && localTime < localAutumn) {
        season = "summer"
      } else if (localTime >= localAutumn && localTime < localWinter) {
        season = "autumn"
      } else {
        season = "winter"
      }
    } else {
      // 南半球跟北半球相反
      if (localTime >= localSpring && localTime < localSummer) {
        season = "autumn"
      } else if (localTime >= localSummer && localTime < localAutumn) {
        season = "winter"
      } else if (localTime >= localAutumn && localTime < localWinter) {
        season = "spring"
      } else {
        season = "summer"
      }

    }

    season
  }

  /**
    * 获取某年某月某日的date
    *
    * @param year
    * @param month
    * @param day
    * @return
    */
  def getYearDay(year: Int, month: Int, day: Int): String = {
    val fmDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")

    // 获得当前日期对象
    val cal = Calendar.getInstance
    // 清除信息
    cal.clear()

    cal.set(Calendar.YEAR, year)
    // 1月从0开始
    cal.set(Calendar.MONTH, month - 1)
    // 当月1号
    cal.set(Calendar.DAY_OF_MONTH, day)

    fmDate.format(cal.getTime)
  }

  /**
    * 将日期转换为时间戳
    */
  def tranTimeToLong(tm: String): Long = {
    val fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    val dt = fm.parse(tm)
    val aa = fm.format(dt)
    val tim: Long = dt.getTime()
    tim / 1000
  }

  /**
    * 将时间戳转换为日期
    */
  def tranTimeToString(tm: String): String = {
    val fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    val tim = fm.format(new Date(tm.toLong * 1000))
    tim
  }
}

猜你喜欢

转载自blog.csdn.net/qq_39313597/article/details/88873425