在Java中创建Calendar对象的临时副本

我需要弄清楚如何创建一个临时日历对象(已经存在的“永久”日历的副本),以便我可以操作副本:tempCal.add(unit,value)。 我需要保持原始日历对象不变,所以我真的不想直接调用add(unit,value)。

由于我创建副本的所有尝试都没有实际起作用,我当前的丑陋黑客是调用permanentCal.add(单位,值),显示所需的结果,然后调用permanentCal.add(unit,-value) – 看起来,酷。

java.util.Calendar有一个clone方法,你可以使用它。 其中的所有数据都是由原语组成的,因此您不会遇到麻烦。

看看这些答案:

  • 日历的防御性副本
  • 克隆GregorianCalendar的最快方法?

(不适用于Android)

切换到java 8的不可变LocalDateTime ,Calendar / Date的后继者。 这个API是一个巨大的改进,起初可能有点压倒性。

minusDays(long)这样的方法会返回一个新的日期。 这使得线程安全性和所有。 例如,能够共享一个值,而不用担心有人改变它。

乔达时间

如果您想以酷炫的方式执行此操作,请使用Joda-Time库。

这个非常成功的第三方开源日期时间框架为现在内置于Java 8及更高版本的java.time框架提供了灵感。