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

Kotlin中如何更简洁设置DateTime?为何apply等函数无效?

问题原因与简洁解决方案

嘿,这个问题的核心其实是你没注意到DateTime(大概率是Joda Time或同类库的实现)是不可变对象!

为什么apply写法没生效?

你用apply作用域函数时,调用hourOfDay().setCopy(hour)这类方法,并不会修改原pickUpDate对象——这类不可变时间类的setCopy方法会返回一个全新的DateTime实例,而你在apply里只是调用了方法,却没有把这个新实例赋值回pickUpDate变量。apply本身最终返回的是原来的对象,所以你的原变量完全没被更新,自然看不到效果。

更简洁的正确写法

既然每个setCopy都会返回新对象,我们可以直接用链式调用一次性完成赋值,比你原来多次赋值的写法简洁多了:

pickUpDate = pickUpDate
    .hourOfDay().setCopy(10)
    .minuteOfHour().setCopy(0)
    .secondOfMinute().setCopy(0)

如果一定要用作用域函数,run也能实现(不过链式写法已经足够直观):

pickUpDate = pickUpDate.run {
    hourOfDay().setCopy(10)
        .minuteOfHour().setCopy(0)
        .secondOfMinute().setCopy(0)
}

关键提醒

这类不可变时间类的设计逻辑是:所有修改操作都不会改变原对象,而是生成新实例。所以必须把新实例重新赋值给变量,才能让变量指向更新后的时间——这和Calendar这类可变时间类的操作逻辑完全不同哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:27:03