Kotlin史上最全Date擴(kuò)展

一拾弃、擴(kuò)展使用

1.字符串轉(zhuǎn)日期

 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.日期轉(zhuǎn)字符串

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

3.日期轉(zhuǎn)各種日期

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

4.各種日期開始結(jié)束判斷

 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.*
/**
 * 描述:
 *    日期擴(kuò)展
 * @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 當(dāng)前日期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 當(dāng)前日期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 轉(zhuǎn) Date
 */
fun LocalDate?.asDate() : Date? {
    return this?.let{ DateExt.asDate(it) }
}

/**
 * LocalDateTime 轉(zhuǎn) 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 日期是否在閉區(qū)間內(nèi) **/
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 日期是否在閉區(qū)間內(nèi) **/
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 日期是否在閉區(qū)間內(nèi) **/
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 日期是否在閉區(qū)間內(nèi) **/
fun LocalDateTime.isClosed(start: LocalDateTime, end: LocalDateTime): Boolean {
    return this.toLocalDate().isClosed(start, end) && this.toLocalTime().isClosed(start, end)
}
/** 毫秒轉(zhuǎn) 日期 **/
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())
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纽乱,一起剝皮案震驚了整個濱河市台夺,隨后出現(xiàn)的幾起案子腔剂,更是在濱河造成了極大的恐慌堪伍,老刑警劉巖解寝,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扩然,死亡現(xiàn)場離奇詭異,居然都是意外死亡聋伦,警方通過查閱死者的電腦和手機(jī)夫偶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘉抓,“玉大人索守,你說我怎么就攤上這事∫制” “怎么了卵佛?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長敞斋。 經(jīng)常有香客問我截汪,道長,這世上最難降的妖魔是什么植捎? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任衙解,我火速辦了婚禮,結(jié)果婚禮上焰枢,老公的妹妹穿的比我還像新娘蚓峦。我一直安慰自己舌剂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布暑椰。 她就那樣靜靜地躺著霍转,像睡著了一般。 火紅的嫁衣襯著肌膚如雪一汽。 梳的紋絲不亂的頭發(fā)上避消,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機(jī)與錄音召夹,去河邊找鬼岩喷。 笑死,一個胖子當(dāng)著我的面吹牛监憎,可吹牛的內(nèi)容都是我干的纱意。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼枫虏,長吁一口氣:“原來是場噩夢啊……” “哼妇穴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起隶债,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腾它,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后死讹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞒滴,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年赞警,在試婚紗的時候發(fā)現(xiàn)自己被綠了妓忍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡愧旦,死狀恐怖世剖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笤虫,我是刑警寧澤旁瘫,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站琼蚯,受9級特大地震影響酬凳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遭庶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一宁仔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧峦睡,春花似錦翎苫、人聲如沸权埠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弊知。三九已至,卻和暖如春粱快,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叔扼。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工事哭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓜富。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓鳍咱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親与柑。 傳聞我的和親對象是個殘疾皇子谤辜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容