You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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上跑起来毫无压力。

步骤很简单:

  1. 在你app模块的build.gradle(注意是Module级别的那个)里加依赖:
dependencies {
    implementation 'com.jakewharton.threetenabp:threetenabp:1.4.0'
}
  1. 在你的Application类里初始化库(要是还没自定义Application,就新建一个,记得在Manifest里注册):
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        AndroidThreeTen.init(this);
    }
}
  1. 之后你就能像在API26+上那样正常用plus方法了,代码简洁得很:
LocalDateTime originalDateTime = ...;
Duration duration = ...;
LocalDateTime newDateTime = originalDateTime.plus(duration);

这个方案的好处是不用手动拆分量,代码更易读,而且后续要用到其他Java时间API的功能也不用再头疼兼容性问题,一步到位。

内容的提问来源于stack exchange,提问作者fpiechowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:28:09