我正在处理一些遗留代码,其中 java.util.Calendar
用于与日期相关的计算(基本上是添加月份)。现在我想在代码中用 java.time.LocalDate
替换 java.util.Calendar
但我不想改变行为。因此,我一直在寻找一个来源,该来源阐明它们对任何情况下的相同计算都会产生相同的结果,但我找不到任何来源。
特别是我想知道是否有一个日期使它们产生不同的结果:
Calendar#add(Calendar.MONTH, 月)
和
LocalDate#plusMonth(月)
我已经测试了一些极端情况(例如与闰年相关的日期),它们似乎产生了相同的结果,但我不能 100% 确定这一点。是否有关于此的任何官方信息或它们之间的一些已知差异?
最佳答案
长话短说
如果:
- 您确定您的
Calendar
真的是GregorianCalendar
(迄今为止最常用的子类),以及…… - 你的约会时间不会超过 100 年前,那么……
…你可以安全地使用LocalDate#plusMonth(months)
而不是 Calendar#add(Calendar.MONTH, months)
.
详情
祝贺您决定从旧的和设计不佳的 Calendar
类迁移到 java.time 的 LocalDate
,现代 Java 日期和时间 API。这将改进您的代码库。
你是对的,你提到的方法用于相同的目的并且通常工作相同。因此,当您从 Calendar
迁移到 java.time 时,如果您发现 LocalDate
是适合使用的新类,那么您将使用 LocalDate#plusMonth(months )
您之前使用 Calendar#add(Calendar.MONTH, months)
的地方。
差异包括:
Calendar
class 是表示许多不同日历系统( Gregorian 、 Buddhist 等)中日期(和时间)的类的抽象父类(super class),LocalDate
始终在公历中。由于每个日历系统都有自己对月份的定义,因此在公历以外的日历中添加月份数可能会得到与LocalDate.plusMonths
给出的结果截然不同的结果。- 如果您的日期可以追溯到历史上,
LocalDate
使用 proleptic Gregorian calendar 也会产生细微差别.这意味着它不使用 Julian calendar几个世纪前使用它的日期。 - 当
Calendar.add
修改您调用它的Calendar
对象时,LocalDate.plusMonths
返回具有新日期的新LocalDate
对象。 - 虽然要在日历中倒退,您需要将负数的月份传递给
Calendar::add
,LocalDate
有一个方便的minusMonths
您通常希望使用而不是plusMonths
的方法(尽管两者都有效)。 - 每个类可以表示的日期范围是不同的。我不太记得每个日期的最小和最大日期。在
Calendar
/GregorianCalendar
上,查看它们的各种方法,例如getGreatestMinimum
和getLeastMaximum
。对于LocalDate
,请参阅常量:MAX
&MIN
.
关于java - Calendar#add(Calendar.MONTH, months) 和 LocalDate#plusMonth(months) 之间有什么不同的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57901548/