前言:为方便调用使用时间的工具类花了一些时间改造成kt版本 通过扩展函数,部分使用infix来代替Util, 使用详情大部分可以看注释,最底下有main方法,可以自己跑跑看看
/**
* @auther :Gy
* @date: 2022/11/14
* java 调取方式 GyDateUtilKt.getDateYMD(long:Long)
* kt 调取方式 在本类最下面的main方法即可查看和测试
* xml 导入包方式 '包名.GyDateUtilKT' 在xml中使用和java使用的方式是一样的
*
*
* * android:id="@+id/my_time" * android:layout_width="wrap_content" * android:layout_height="wrap_content" * android:text='@{myFragmentStates.userInfo.vipGrade>0?"会员到期日期:"+GyDateUtilKT.getDateYMD(myFragmentStates.userInfo.vipExpireDate):"暂未开通会员"}' * android:textSize="12sp" /> */ @file:JvmName("GyDateUtilKT") package 改成你自己的包名地址 import android.annotation.SuppressLint import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs private val getTimeError = "获取日期异常" private val ymdhms = "yyyy-MM-dd HH:mm:ss" private val ymdhms2 = "yyyyMMddHHmmss" private val hms = "HH:mm:ss" private val hm = "HH:mm" private val ymd = "yyyy-MM-dd" // ?压脉带? private val am = "AM" // 上午 private val pm = "PM" // 下午 @SuppressLint("SimpleDateFormat") fun getDataYMD() = System.currentTimeMillis().getDateYMD() @SuppressLint("SimpleDateFormat") fun getDataYMDHMS() = System.currentTimeMillis().getDateYMDHMS() /** * 直接通过long 获取转换为yyyy-MM-dd格式的时间 */ @SuppressLint("SimpleDateFormat") fun Long.getDateYMD(): String { val sdf = SimpleDateFormat(ymd) sdf.timeZone = TimeZone.getTimeZone("GMT+8") return try { sdf.format(this) } catch (e: Exception) { sdf.format(System.currentTimeMillis()) } } /** * 直接通过long 获取转换为yyyy-MM-dd HH:mm:ss格式的时间 */ @SuppressLint("SimpleDateFormat") fun Long.getDateYMDHMS(): String { val sdf = SimpleDateFormat(ymdhms) sdf.timeZone = TimeZone.getTimeZone("GMT+8") return try { sdf.format(this) } catch (e: Exception) { sdf.format(System.currentTimeMillis()) } } @SuppressLint("SimpleDateFormat") fun Long.getDateHM(): String { val sdf = SimpleDateFormat(hm) sdf.timeZone = TimeZone.getTimeZone("GMT+8") return try { sdf.format(this) } catch (e: Exception) { sdf.format(System.currentTimeMillis()) } } /** * 自定义获取返回的类型 */ fun getDate(type: Int): String { return System.currentTimeMillis().getDate(type) } /** * 自定义返回的类型 * 1 :[ymdhms] * 2 :[hms] * 3 :[hm] */ @SuppressLint("SimpleDateFormat") fun Long.getDate(type: Int = 1): String { val sdf = if (type == 1) { SimpleDateFormat(ymdhms) } else if (type == 2) { SimpleDateFormat(hms) } else if (type == 3) { SimpleDateFormat(hm) } else { SimpleDateFormat(ymdhms) } sdf.timeZone = TimeZone.getTimeZone("GMT+8") return try { sdf.format(this) } catch (e: Exception) { sdf.format(System.currentTimeMillis()) } } // 时间转换为long 格式要求为 ymdhms @SuppressLint("SimpleDateFormat") fun String.changeToYMDHMSString(): String = "${SimpleDateFormat(ymdhms).parse(this)?.time ?: getTimeError}" @SuppressLint("SimpleDateFormat") fun String.changeToYMDString(): String = "${SimpleDateFormat(ymd).parse(this)?.time ?: getTimeError}" @SuppressLint("SimpleDateFormat") fun String.changeToHMString(): String = "${SimpleDateFormat(hm).parse(this)?.time ?: getTimeError}" /** * 转换时间为long * 需要格式为 ymdhms 要知道每个信息才可以正确转换为long */ @SuppressLint("SimpleDateFormat") fun String.changeYMDHMSTimeToLong(): Long { val simple = SimpleDateFormat(ymdhms) val date = simple.parse(this) return date.time } /** * string 秒换算为时分秒 */ fun String.secondChangeHourMinuteSecond(needHour: Boolean = true) = this.toInt().secondChangeHourMinuteSecond(needHour) /** * int 秒换算为时分秒 */ fun Int.secondChangeHourMinuteSecond(needHour: Boolean = true): String { var h = 0 var d = 0 var s = 0 val temp = this % 3600 if (this > 3600) { h = this / 3600 if (temp != 0) { if (temp > 60) { d = temp / 60 if (temp % 60 != 0) { s = temp % 60 } } else { s = temp } } } else { // 小于1小时 // 当前时间除以60 获取当前是多少分钟 d = this / 60 if (this % 60 != 0) { s = this % 60 } } val hStrings = if (h < 10) { "0${h}" } else { "$h" } val dStrings = if (d < 10) { "0${d}" } else { "$d" } val sStrings = if (s < 10) { "0${s}" } else { "$s" } return if (needHour) "${hStrings}:${dStrings}:${sStrings}" else "${dStrings}:${sStrings}" } /** * 计算两个日期所差的天数 * 返回为int = 0 则同一天 * < 0 为前一天 * GyDateUtilKT.differDay(c1.getTimeInMillis(), c2.getTimeInMillis()); * infix 在java中调用和正常调用是一样的 */ infix fun Long.differDay(milliseconds2: Long): Int { val dar1 = Calendar.getInstance() dar1.timeInMillis = this val dar2 = Calendar.getInstance() dar2.timeInMillis = milliseconds2 // 先判断是否同年 val y1 = dar1.get(Calendar.YEAR) val y2 = dar2.get(Calendar.YEAR) val d1 = dar1.get(Calendar.DAY_OF_YEAR) val d2 = dar2.get(Calendar.DAY_OF_YEAR) return if (y1 - y2 > 0) { d1 - d2 + dar2.getActualMaximum(Calendar.DAY_OF_YEAR) } else if (y1 - y2 < 0) { d1 - d2 - dar1.getActualMaximum(Calendar.DAY_OF_YEAR) } else { d1 - d2 } } /** * 计算两个日期所差的小时数 * GyDateUtilKT.differHours(c1.getTimeInMillis(), c2.getTimeInMillis()); * infix 在java中调用和正常调用是一样的 */ infix fun Long.differHours(date2: Long): Int { val dar1 = Calendar.getInstance() dar1.timeInMillis = this val dar2 = Calendar.getInstance() dar2.timeInMillis = date2 val h1: Int = dar1.get(Calendar.HOUR_OF_DAY) val h2: Int = dar2.get(Calendar.HOUR_OF_DAY) val day = this differDay date2 return h1 - h2 + day * 24 } /** * 计算两个日期所差的分钟数 * GyDateUtilKT.differMinutes(c1.getTimeInMillis(), c2.getTimeInMillis()); * infix 在java中调用和正常调用是一样的 */ infix fun Long.differMinutes(date2: Long): Int { val dar1 = Calendar.getInstance() dar1.timeInMillis = this val dar2 = Calendar.getInstance() dar2.timeInMillis = date2 val m1: Int = dar1.get(Calendar.MINUTE) val m2: Int = dar2.get(Calendar.MINUTE) val h = this differHours date2 return m1 - m2 + h * 60 } /** * 获取周几 * Monday周一 以下方法以此类推 * 带时分秒的获取出来的日期 他的日期都是你某个时间段调用的日期 */ fun getMondayYMDHMS() = Calendar.MONDAY.getDayOfWeek(ymdhms) fun getTuesdayYMDHMS() = Calendar.TUESDAY.getDayOfWeek(ymdhms) fun getWenesdayYMDHMS() = Calendar.WEDNESDAY.getDayOfWeek(ymdhms) fun getThursdayYMDHMS() = Calendar.THURSDAY.getDayOfWeek(ymdhms) fun getFridayYMDHMS() = Calendar.FRIDAY.getDayOfWeek(ymdhms) fun getSaturdayYMDHMS() = Calendar.SATURDAY.getDayOfWeek(ymdhms) fun getSundayYMDHMS() = Calendar.SUNDAY.getDayOfWeek(ymdhms) fun getMondayYMD() = Calendar.MONDAY.getDayOfWeek(ymd) fun getTuesdayYMD() = Calendar.TUESDAY.getDayOfWeek(ymd) fun getWenesdayYMD() = Calendar.WEDNESDAY.getDayOfWeek(ymd) fun getThursdayYMD() = Calendar.THURSDAY.getDayOfWeek(ymd) fun getFridayYMD() = Calendar.FRIDAY.getDayOfWeek(ymd) fun getSaturdayYMD() = Calendar.SATURDAY.getDayOfWeek(ymd) fun getSundayYMD() = Calendar.SUNDAY.getDayOfWeek(ymd) /** * 获取本月的第一天 */ @SuppressLint("SimpleDateFormat") fun getFirstDayInMonth(): String { return tryCatch { val c = GregorianCalendar() val simple = SimpleDateFormat(ymd) c.set(GregorianCalendar.DAY_OF_MONTH, 1) simple.format(c.time) } } /** * 获取本月最后一天 */ @SuppressLint("SimpleDateFormat") fun getLastDayInMonth() = tryCatch { val c = GregorianCalendar() val simple = SimpleDateFormat(ymd) c.set(Calendar.DATE, 1) c.roll(Calendar.DATE, -1) simple.format(c.time) } /** * 获取本周的某一天 */ @SuppressLint("SimpleDateFormat") private fun Int.getDayOfWeek(format: String): String { return tryCatch { val c = GregorianCalendar() val simple = SimpleDateFormat(format) val week = c.get(Calendar.DAY_OF_WEEK) if (week == this) { simple.format(c.time) } else { var offectDay = this - week if (this == Calendar.SUNDAY) { offectDay = 7 - abs(offectDay) } c.add(Calendar.DATE, offectDay) simple.format(c.time) } } } /** * 检测当前是否是闰年 * (year能被4整除 并且 不能被100整除) 或者 year能被400整除,则该年为闰年. */ fun Int.checkIsLeapYear() = this % 4 == 0 && this % 400 != 0 || this % 400 == 0 fun String.checkIsLeapYear() = this.toInt().checkIsLeapYear() /** * 根据当前日期判断上午还是下午 */ @SuppressLint("SimpleDateFormat") fun String.getTimeQuantumYMDHMS(): String { val date = SimpleDateFormat(ymdhms).parse(this) ?: return getTimeError return if (date.hours >= 12) pm else am } /** * 严格要求时间格式为[ymdhms] */ @SuppressLint("SimpleDateFormat") fun String.getDynamicTime(): String { val simple = SimpleDateFormat(ymdhms) val c1 = Calendar.getInstance() val c2 = Calendar.getInstance() return tryCatch { c1.time = Date() c2.time = simple.parse(this) val d = c1.timeInMillis differDay c2.timeInMillis if (d == 0) { val h = c1.timeInMillis differHours c2.timeInMillis if (h > 0) { return "今天${getStringByFormat(2)}" // return "${h}小时前" } else if (h < 0) { // return "${abs(h)}小时后" } else if (h == 0) { val m = c1.timeInMillis differMinutes c2.timeInMillis if (m > 0) { return "${m}分钟前" } else if (m < 0) { // return "${abs(m)}分钟后" } else { return "刚刚" } } } else if (d > 0) { if (d == 1) { return "昨天${getStringByFormat(2)}" } else if (d == 2) { return "前天${getStringByFormat(2)}" } else { return "${getStringByFormat()}" } } else if (d < 0) { if (d == -1) { // return "明天${getStringByFormat()}" } else if (d == -2) { // return "后天${getStringByFormat()}" } else { // return "${abs(d)}天后${getStringByFormat()}" } } getStringByFormat() } } /** * @param type 要返回数据格式类型: 需要传入一个YMDHMS 会返回 type类型的 */ @SuppressLint("SimpleDateFormat") fun String.getStringByFormat(type: Int = 1): String { val long = this.changeYMDHMSTimeToLong() return long.getDate(type) } @SuppressLint("SimpleDateFormat") fun String.getTimeQuantumHMS(): String { val date = SimpleDateFormat(hms).parse(this) ?: return getTimeError return if (date.hours >= 12) pm else am } /** * 获取距离当天晚上00:00:00的时间 * 分割方式以':'冒号分割 * 可以用解构去解析 * */ fun getTodayLastTime(): String { return tryCatch { val simpleDateFormat = SimpleDateFormat(ymdhms2) val currentTime = simpleDateFormat.format(Date()) val substring = currentTime.substring(0, 8) + "235959" val nowTime = simpleDateFormat.parse(currentTime).time / 1000 val endTime = simpleDateFormat.parse(substring).time / 1000 val totalTime = endTime - nowTime val hour = Math.floor((totalTime / 3600).toDouble()).toInt() val minute = Math.floor(((totalTime - hour * 3600) / 60).toDouble()).toInt() val second = Math.floor((totalTime - hour * 3600 - minute * 60).toDouble()).toInt() "$hour:$minute:$second" } } private inline fun tryCatch(block: () -> String): String { return try { block() } catch (e: Exception) { e.printStackTrace() getTimeError } } fun main(args: Array println("guo:${3701.secondChangeHourMinuteSecond()}") println("guo:${"3701".secondChangeHourMinuteSecond()}") println("guo:${61.secondChangeHourMinuteSecond()}") println("guo:${60.secondChangeHourMinuteSecond()}") println("guo:${2.secondChangeHourMinuteSecond()}") println("guo:${0.secondChangeHourMinuteSecond()}") val nowTime = System.currentTimeMillis() println("guo:${nowTime} ----${nowTime.getDateYMD()}") println("guo:${nowTime} ----${nowTime.getDateHM()}") println("guo:${nowTime} ----${nowTime.getDateYMDHMS().changeToYMDHMSString()}") // 因转换的数据没有时分秒 所以数据和有时分秒的数据是有偏差的 println("guo:${nowTime} ----${nowTime.getDateYMD().changeToYMDString()}") println("guo:${nowTime} ----${nowTime.getDateYMD().changeToYMDString()}") println("guo---------------------------") println(getMondayYMDHMS()) println(getTuesdayYMDHMS()) println(getWenesdayYMDHMS()) println(getThursdayYMDHMS()) println(getFridayYMD()) println(getSaturdayYMD()) println(getSundayYMD()) println("guo---------------------------") println("2020".checkIsLeapYear()) println("2013".checkIsLeapYear()) println("guo---------------------------") println("20:22:10".getTimeQuantumHMS()) println("2022-11-15 10:22:10".getTimeQuantumYMDHMS()) println("guo---------------------------") println("动态时间${"2023-01-18 01:30:02".getDynamicTime()}") } 精彩文章
发表评论