如何将Java LocalDate转换为ThreeTen LocalDate适配API23?
解决方案
前提准备
确保项目已引入ThreeTenABP依赖(适配API26以下的Java时间库兼容方案),并在Application类中完成初始化:
// 依赖示例(可根据实际需求调整版本) implementation 'com.jakewharton.threetenabp:threetenabp:1.4.6'
// 在自定义Application类中初始化ThreeTenABP class MyApplication : Application() { override fun onCreate() { super.onCreate() AndroidThreeTen.init(this) } }
两种可行的转换方法
Java java.time.LocalDate 和ThreeTen org.threeten.bp.LocalDate 均基于ISO-8601标准实现,转换逻辑简单直接:
方法1:通过纪元天数转换(最简洁)
利用两者兼容的纪元天数(从1970-01-01起的累计天数)完成转换:
import org.threeten.bp.LocalDate as ThreeTenLocalDate import java.time.LocalDate as JavaLocalDate override fun onRangeChanged(firstVisibleDate: JavaLocalDate, lastVisibleDate: JavaLocalDate) { val threeTenDate = ThreeTenLocalDate.ofEpochDay(firstVisibleDate.toEpochDay()) onRangeChange(threeTenDate) }
方法2:提取年月日字段构建
直接获取Java LocalDate的年、月、日数值,手动构建ThreeTen LocalDate:
import org.threeten.bp.LocalDate as ThreeTenLocalDate import java.time.LocalDate as JavaLocalDate override fun onRangeChanged(firstVisibleDate: JavaLocalDate, lastVisibleDate: JavaLocalDate) { val threeTenDate = ThreeTenLocalDate.of( firstVisibleDate.year, firstVisibleDate.monthValue, firstVisibleDate.dayOfMonth ) onRangeChange(threeTenDate) }
注意事项
- 导入时使用
as别名区分两个LocalDate类,避免命名冲突; - 必须确保ThreeTenABP已在Application中完成初始化,否则会触发运行时异常。
内容的提问来源于stack exchange,提问作者Ismael Toro
相关产品推荐
相关产品推荐

