material-calendarview所用threeten LocalDate与java.time.LocalDate冲突,求解决方案或替代组件
解决方案
现有库兼容绕过方案
- 边界转换适配:仅在调用日历库的入参、返回值处理的边界位置做类型转换,所有业务逻辑仍保留使用
java.time.LocalDate,无需修改现有业务代码,仅需封装一个独立转换工具类即可,参考实现如下:
public class CalendarDateConverter { // 将业务层使用的java.time.LocalDate转为库要求的threeten LocalDate,仅调用日历API时使用 public static org.threeten.bp.LocalDate toLibLocalDate(java.time.LocalDate source) { return org.threeten.bp.LocalDate.of(source.getYear(), source.getMonthValue(), source.getDayOfMonth()); } // 将日历返回的threeten LocalDate转为业务层使用的java.time.LocalDate public static java.time.LocalDate toBizLocalDate(org.threeten.bp.LocalDate source) { return java.time.LocalDate.of(source.getYear(), source.getMonthValue(), source.getDayOfMonth()); } }
如果对包体积要求较高,不需要全量引入threeten backport,可以在gradle中配置该依赖仅为编译时可见,打包时自动剔除,同时通过反射修改库内部日期解析逻辑,该方案复杂度较高,非必要不建议使用。
替代库方案
如果不想做额外适配,可以直接替换为原生支持java.time.LocalDate的同类型日历组件:
- Google官方Material Components日历选择器:原生符合Material设计规范,支持单日期、多日期、日期范围选择等多种模式,minSdk≥26时直接支持
java.time.LocalDate,低版本配合core library desugaring即可使用,无需额外引入第三方日期类依赖。 - 社区兼容分支:现有原库的社区fork版本已经完成了threeten依赖的移除,直接适配
java.time.LocalDate,API与原库基本对齐,替换成本极低。
内容的提问来源于stack exchange,提问作者Charlie Walker
相关产品推荐
相关产品推荐

