Kotlin史上最全Date扩展

一、扩展使用

1.字符串转日期

 val cst = "Fri Aug 14 10:00:00 CST 2099"
 println(cst.asCstLocalDateTime())

val str = Date().toDateTimeString()
println(str.asLocalDateTime())

val str2 = Date().toDateString()
println(str2.asLocalDate())
println(str2.asLocalDate().asDate())

2.日期转字符串

  println(Date().toDateTimeString())
  println(Date().toDateString())

3.日期转各种日期

  println(Date().toDateTimeString().asLocalDateTime().asDate())
  println(Date().toDateString().asLocalDate().asDate())

4.各种日期开始结束判断

 val start = "2019-10-01".asLocalDate()
 val end = "2019-10-30".asLocalDate()
 println("2019-10-10".asLocalDate()?.isClosed(start!!, end!!))

println(System.currentTimeMillis().asMillisLocalDate()?.lastDayOfQuarter())
println(System.currentTimeMillis().asMillisLocalDateTime()?.lastDayOfQuarter())

二、DateExt.kt

import java.time.*
import java.time.format.DateTimeFormatter
import java.time.temporal.TemporalAdjusters
import java.util.*
/**
 * 描述:
 *    日期扩展
 * @author shihui
 * @version 2019-08-14 10:52
 */
class DateExt {
    companion object {
        @JvmStatic
        val DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
        val DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd")
        val DATE_DENSE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd")
        val DATE_HOUR_DENSE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHH")
        val CST_FORMATTER = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US)


        @JvmStatic
        fun toDateTimeString(date: Date): String {
            return asLocalDateTime(date).format(DATE_TIME_FORMATTER)
        }
        @JvmStatic
        fun toDateString(date: Date): String {
            return asLocalDate(date).format(DATE_FORMATTER)
        }
        @JvmStatic
        fun asLocalDateTime(date: Date) : LocalDateTime {
            return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime()
        }
        @JvmStatic
        fun asLocalDate(date: Date) : LocalDate {
            return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate()
        }
        @JvmStatic
        fun localDateTimeParse(dateTimeStr: String): LocalDateTime {
            return LocalDateTime.parse(dateTimeStr, DATE_TIME_FORMATTER)
        }
        @JvmStatic
        fun cstLocalDateTimeParse(dateTimeStr: String): LocalDateTime {
            return CST_FORMATTER.parse(dateTimeStr, LocalDateTime::from)
        }
        @JvmStatic
        fun localDateParse(dateTimeStr: String): LocalDate {
            return LocalDate.parse(dateTimeStr, DATE_FORMATTER)
        }

        @JvmStatic
        fun asDate(localDateTime: LocalDateTime) : Date {
            return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant())
        }
        @JvmStatic
        fun asDate(localDate: LocalDate) : Date {
            return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant())
        }
        @JvmStatic
        fun asMillisLocalDateTime(milliseconds: Long) : LocalDateTime {
            return Instant.ofEpochMilli(milliseconds)
                    .atZone(ZoneId.systemDefault())
                    .toLocalDateTime()
        }
        @JvmStatic
        fun asMillisLocalDate(milliseconds: Long) : LocalDate {
            return Instant.ofEpochMilli(milliseconds)
                    .atZone(ZoneId.systemDefault())
                    .toLocalDate()
        }
        /**
         * 获取某季度的第一天
         * 第一季度:1月-3月
         * 第二季度:4月-6月
         * 第三季度:7月-9月
         * 第四季度:10月-12月
         * @param date 当前日期LocalDate
         * @return LocalDate
         */
        @JvmStatic
        fun firstDayOfQuarter(date: LocalDate): LocalDate {
            val month = date.month.value
            return when {
                month in 4..6 -> date.withMonth(4).with(TemporalAdjusters.firstDayOfMonth())
                month in 7..9 -> date.withMonth(7).with(TemporalAdjusters.firstDayOfMonth())
                month >= 10 -> date.withMonth(10).with(TemporalAdjusters.firstDayOfMonth())
                else -> date.withMonth(1).with(TemporalAdjusters.firstDayOfMonth())
            }
        }

        /**
         * 获取某季度的最后一天
         * 第一季度:1月-3月
         * 第二季度:4月-6月
         * 第三季度:7月-9月
         * 第四季度:10月-12月
         *
         * @param date 当前日期LocalDate
         * @return LocalDate
         */
        @JvmStatic
        fun lastDayOfQuarter(date: LocalDate): LocalDate {
            val month = date.month.value
            return when {
                month in 4..6 -> date.withMonth(6).with(TemporalAdjusters.lastDayOfMonth())
                month in 7..9 -> date.withMonth(9).with(TemporalAdjusters.lastDayOfMonth())
                month >= 10 -> date.withMonth(12).with(TemporalAdjusters.lastDayOfMonth())
                else -> date.withMonth(3).with(TemporalAdjusters.lastDayOfMonth())
            }
        }
    }
}

/**
 * yyyy-MM-dd HH:mm:ss
 */
fun Date?.toDateTimeString(): String? {
    return this?.let { DateExt.toDateTimeString(it) }
}

/**
 * yyyy-MM-dd
 */
fun Date?.toDateString(): String? {
    return this?.let{ DateExt.toDateString(it) }
}
fun Date?.asLocalDateTime(): LocalDateTime? {
    return this?.let{ DateExt.asLocalDateTime(it) }
}
fun Date?.asLocalDate(): LocalDate? {
    return this?.let{ DateExt.asLocalDate(it) }
}

/**
 * 字符串 yyyy-MM-dd HH:mm:ss 格式成日期
 */
fun String?.asLocalDateTime(): LocalDateTime? {
    return this?.let { DateExt.localDateTimeParse(it) }
}
fun String?.asCstLocalDateTime(): LocalDateTime? {
    return this?.let { DateExt.cstLocalDateTimeParse(it) }
}

/**
 * 字符串 yyyy-MM-dd 格式成日期
 */
fun String?.asLocalDate(): LocalDate? {
    return this?.let{ DateExt.localDateParse(it) }
}

/**
 * LocalDate 转 Date
 */
fun LocalDate?.asDate() : Date? {
    return this?.let{ DateExt.asDate(it) }
}

/**
 * LocalDateTime 转 Date
 */
fun LocalDateTime?.asDate(): Date? {
    return this?.let { DateExt.asDate(it) }
}

/**
 * yyyy-MM-dd HH:mm:ss
 */
fun LocalDateTime?.toDateTimeString(): String? {
    return this?.format(DateExt.DATE_TIME_FORMATTER)
}
/**
 * yyyyMMdd
 */
fun LocalDateTime?.toDateDenseString(): String? {
    return this?.format(DateExt.DATE_DENSE_FORMATTER)
}
/**
 * yyyyMMdd
 */
fun LocalDate?.toDateDenseString(): String? {
    return this?.format(DateExt.DATE_DENSE_FORMATTER)
}
/**
 * yyyy-MM-dd
 */
fun LocalDate?.toDateString(): String? {
    return this?.format(DateExt.DATE_FORMATTER)
}


/** Date 日期是否在闭区间内 **/
fun Date.isClosed(start: Date, end: Date): Boolean {
    return this.time.isClosed(start, end)
}
fun Long.isClosed(start: Date, end: Date): Boolean {
    return (start.time <= this && this <= end.time)
}
fun Long.isClosed(start: Long, end: Long): Boolean {
    return (start <= this && this <= end)
}

/** LocalTime 日期是否在闭区间内 **/
fun LocalTime.isClosed(start: LocalTime, end: LocalTime): Boolean {
    return this.toNanoOfDay().isClosed(start, end)
}
fun LocalTime.isClosed(start: LocalDateTime, end: LocalDateTime): Boolean {
    return this.toNanoOfDay().isClosed(start.toLocalTime(), end.toLocalTime())
}
fun Long.isClosed(start: LocalTime, end: LocalTime): Boolean {
    return (start.toNanoOfDay() <= this && this <= end.toNanoOfDay())
}

/** LocalDate 日期是否在闭区间内 **/
fun LocalDate.isClosed(start: LocalDate, end: LocalDate): Boolean {
    return this.toEpochDay().isClosed(start, end)
}
fun LocalDate.isClosed(start: LocalDateTime, end: LocalDateTime): Boolean {
    return this.toEpochDay().isClosed(start.toLocalDate(), end.toLocalDate())
}
fun Long.isClosed(start: LocalDate, end: LocalDate): Boolean {
    return (start.toEpochDay() <= this && this <= end.toEpochDay())
}

/** LocalDateTime 日期是否在闭区间内 **/
fun LocalDateTime.isClosed(start: LocalDateTime, end: LocalDateTime): Boolean {
    return this.toLocalDate().isClosed(start, end) && this.toLocalTime().isClosed(start, end)
}
/** 毫秒转 日期 **/
fun Long?.asMillisDate(): Date? {
    return this?.let { Date(it) }
}
fun Long?.asMillisLocalDateTime(): LocalDateTime? {
    return this?.let { DateExt.asMillisLocalDateTime(it) }
}
fun Long?.asMillisLocalDate(): LocalDate? {
    return this?.let { DateExt.asMillisLocalDate(it) }
}

/** 月份最后一天 **/
fun LocalDateTime.lastDayOfMonth(): LocalDateTime {
    return with(TemporalAdjusters.lastDayOfMonth())
}
/** 月份第一天 **/
fun LocalDateTime.firstDayOfMonth(): LocalDateTime {
    return with(TemporalAdjusters.firstDayOfMonth())
}

/** 年份最后一天 **/
fun LocalDateTime.lastDayOfYear(): LocalDateTime {
    return with(TemporalAdjusters.lastDayOfYear())
}
/** 年份第一天 **/
fun LocalDateTime.firstDayOfYear(): LocalDateTime {
    return with(TemporalAdjusters.firstDayOfYear())
}

/**
 * 季度最后一天
 * 第一季度:1月-3月
 * 第二季度:4月-6月
 * 第三季度:7月-9月
 * 第四季度:10月-12月
 **/
fun LocalDate.lastDayOfQuarter(): LocalDate {
    return DateExt.lastDayOfQuarter(this)
}
fun LocalDateTime.lastDayOfQuarter(): LocalDate {
    return DateExt.lastDayOfQuarter(this.toLocalDate())
}
/**
 * 季度第一天
 * 第一季度:1月-3月
 * 第二季度:4月-6月
 * 第三季度:7月-9月
 * 第四季度:10月-12月
 **/
fun LocalDate.firstDayOfQuarter(): LocalDate {
    return DateExt.firstDayOfQuarter(this)
}
fun LocalDateTime.firstDayOfQuarter(): LocalDate {
    return DateExt.firstDayOfQuarter(this.toLocalDate())
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容