API 19(KitKat)下如何为LocalDateTime添加Duration
嘿,这个问题我之前帮不少开发者解决过——毕竟API19的设备虽然占比低,但还是有不少存量用户需要照顾对吧?
首先得明确:原生Android在API26以下根本没有java.time包(也就是你用的LocalDateTime、Duration这些类),你现在能用上这些类,要么是开启了desugar编译兼容,要么是已经在使用第三方兼容库。而你遇到的plus(TemporalAmount)方法不支持的问题,有两个靠谱的解决办法:
方法一:手动拆分Duration分量逐个添加
如果不想折腾依赖或者调整编译配置,直接把Duration拆成天、小时、分钟、秒、纳秒这些单独的部分,然后调用LocalDateTime的对应plusXXX方法就行(这些方法在绝大多数兼容实现里都是支持的):
示例代码:
LocalDateTime originalDateTime = ...; // 你的LocalDateTime实例 Duration duration = ...; // 你的Duration实例 // 先拆分Duration的各个分量 long days = duration.toDays(); long hours = duration.toHours() % 24; long minutes = duration.toMinutes() % 60; long seconds = duration.getSeconds() % 60; long nanos = duration.getNano(); // 逐个添加到LocalDateTime LocalDateTime newDateTime = originalDateTime .plusDays(days) .plusHours(hours) .plusMinutes(minutes) .plusSeconds(seconds) .plusNanos(nanos);
要是你的兼容环境不支持Java9+的toHoursPart()这类方法,上面的拆分方式就完全适用,纯手动计算,兼容性拉满。
方法二:用ThreeTenABP兼容库(推荐)
这是Android平台上最成熟的JSR-310(也就是Java 8时间API)兼容方案,完全支持所有API,包括LocalDateTime.plus(TemporalAmount),在API19上跑起来毫无压力。
步骤很简单:
- 在你app模块的
build.gradle(注意是Module级别的那个)里加依赖:
dependencies { implementation 'com.jakewharton.threetenabp:threetenabp:1.4.0' }
- 在你的Application类里初始化库(要是还没自定义Application,就新建一个,记得在Manifest里注册):
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); AndroidThreeTen.init(this); } }
- 之后你就能像在API26+上那样正常用
plus方法了,代码简洁得很:
LocalDateTime originalDateTime = ...; Duration duration = ...; LocalDateTime newDateTime = originalDateTime.plus(duration);
这个方案的好处是不用手动拆分量,代码更易读,而且后续要用到其他Java时间API的功能也不用再头疼兼容性问题,一步到位。
内容的提问来源于stack exchange,提问作者fpiechowski
相关产品推荐
相关产品推荐

