用Kotlin Duration把時間單位換算玩出花
當程序員遇到時間換算...
各位有沒有經歷過這種絕望時刻?產品經理突然拍桌子:"這個功能要顯示三天后的數據!" 然后你手忙腳亂開始算:24小時×3天=72小時→72×3600=259200秒→再×1000...數著數著零就暈了?別慌!今天帶你解鎖Kotlin的時空魔法—Duration類,保你從此告別手算時間的石器時代!
時間戳的花式操作
原始人做法(不推薦)
fun calculateFutureTimestamp() {
val currentTime = System.currentTimeMillis() // 掏出懷表看時間
val millisPerDay = 24 * 3600 * 1000L // 開始掰手指算數
val futureTimestamp = currentTime + 3 * millisPerDay // 戰戰兢兢地計算
println("三天后的時間戳: $futureTimestamp") // 祈禱別算錯零
}
痛點分析:這種寫法就像用竹簡寫代碼—容易寫錯、難維護,哪天要改成"三小時"還得重新算一遍!
近代工具TimeUnit
fun calculateFutureTimestamp() {
val currentTime = System.currentTimeMillis()
val millis3Day = TimeUnit.DAYS.toMillis(3) // 使用蒸汽機計算
println("三天后的時間戳: ${currentTime + millis3Day}")
}
進步之處:雖然用上了工廠流水線,但遇到復雜計算(比如3天+5小時)還是得自己拼裝零件
現代魔法Duration
fun durationMagic() {
val currentTime = System.currentTimeMillis().milliseconds // 召喚時間精靈
val futureTime = currentTime + 3.days // 像搭積木一樣組合時間
println("三天后的時間戳: ${futureTime.inWholeMilliseconds}")
}
魔法效果:
? ?? 3.days這種寫法就像在說人話
? ?? 加減乘除直接操作時間單位
? ?? 自動處理閏秒等復雜情況(媽媽再也不用擔心我算錯零了)
時間積木的N種玩法
創建時間積木
fun createDurations() {
val coffeeBreak = 500.milliseconds // 一杯拿鐵的最佳飲用期
val napTime = 1.5.hours // 打工人の黃金時刻
val infiniteVacation = Double.POSITIVE_INFINITY.days // 夢里什么都有
println("咖啡冷卻時間:$coffeeBreak") // 輸出: 500ms
println("摸魚時間還剩:${napTime - 30.minutes}") // 顯示: 1h
}
單位轉換黑科技
fun timeConversion() {
val lessonDuration = 45.minutes
println("相當于:")
println("${lessonDuration.toDouble(DurationUnit.HOURS)} 小時") // 0.75小時
println("${lessonDuration.inWholeSeconds} 秒") // 2700秒
val marathonTime = 4.hours + 30.minutes
println("總分鐘數:${marathonTime.toLong(DurationUnit.MINUTES)}") // 270分鐘
}
時間四則運算
fun timeCalculations() {
val workDay = 8.hours
val fishTime = 2.hours + 45.minutes
val realWorkTime = workDay - fishTime
println("實際工作時間:$realWorkTime") // 5h 15m
println("三倍加班時長:${realWorkTime * 3}") // 15h 45m
}
實例:朋友圈時間顯示
fun formatSocialTime(postTimestamp: Long) {
val currentTime = System.currentTimeMillis()
val timeDiff = (currentTime - postTimestamp).milliseconds
val friendlyText = timeDiff .toComponents { days, hours, minutes, _, _ ->
when {
days > 365 -> "${days/365}年前"
days > 30 -> "${days/30}個月前"
days > 7 -> "${days/7}周前"
days > 0 -> "${days}天前"
hours > 0 -> "${hours}小時前"
minutes > 0 -> "${minutes}分鐘前"
else -> "剛剛"
}
}
println("這條朋友圈發布于:$friendlyText")
}
// 測試用例
formatSocialTime(postTimestamp = System.currentTimeMillis() - 2.days.inWholeMilliseconds)
// 輸出:這條朋友圈發布于:2天前
你可能不知道的彩蛋功能
時間比較大師
fun compareDurations() {
val fastResponse = 1.seconds
val slowResponse = 1500.milliseconds
println("誰更快?${fastResponse < slowResponse}") // 輸出false,閃電俠慘敗?
// 其實是因為1500ms=1.5秒 > 1秒
}
時間格式化神器
fun formatLikePro() {
// 創建考試時長(2小時15分鐘)
val examDuration = 135.minutes
// 兩種格式化方式
println(examDuration.toString(DurationUnit.MINUTES, 1)) // 135.0m
println(examDuration.toIsoString()) // PT2H15M
}
總結:你的時間超能力
Kotlin Duration就像給你的代碼裝上了:
- ? ? 時間翻譯器 - 讓機器理解人類的時間概念
- ? ?? 智能計算器 - 自動處理單位轉換
- ? ?? 時間瑞士軍刀 - 比較、格式化、運算全搞定
下次產品經理再提"顯示三個月前的數據",你可以優雅地寫下:
val historyDataTime = currentTime - 3.months
從此告別996算時間的苦日子,準時下班不是夢!