java - Calendar#add(Calendar.MONTH, months) 和 LocalDate#plusMonth(months) 之间有什么不同的行为吗?

标签 java localdate date java.util.calendar

我正在处理一些遗留代码,其中 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 是表示许多不同日历系统( GregorianBuddhist 等)中日期(和时间)的类的抽象父类(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/

相关文章:

java - 启动flume agent显示jdk路径错误,是目录,无法执行

java - 将长字符串解析为 LocalDate 变量

java - 以特定格式显示 Java.util.Date

r - 从日期中提取年份的天数

Javascript 的日期对象 toLocaleTimeString 添加一个小时

java - Maven Cargo Tomcat 7 server.xml 被覆盖

java - 如何让 "Camera"只显示加载区域的一部分

java - 自定义警报对话框中的 Admob(Ads)

java - 如何获取 OffsetDateTime->LocalDateTime 并将其保存为 UTC?

java - LocalDate.now() 返回错误的日期