请不要这样做。
将两个日期之间的差异表示为“年数”乘数是有问题的,因为两个日期之间一年的平均长度取决于您要比较的日期。这很容易出错,而想出所有必要的测试用例来证明你做对了就更难了。
大多数程序员不应该手动执行日期/时间计算。您几乎保证会弄错。说真的,有so many ways 的东西可以去horribly wrong。地球上只有少数程序员完全理解其中的许多微妙之处。你问这个问题的事实证明你不是他们中的一员,这没关系——我也不是。你和我们绝大多数人一样,应该依赖像java.util.time 这样的可靠日期/时间 API。
如果您真的需要单个数值,那么我能想到的最安全的选择是使用天数,因为LocalDate API 可以为您计算该数字:
long differenceInDays = testDate.until(today, ChronoUnit.DAYS)
请注意,此差异仅对用于产生它的两个日期有效。往返转换很简单:
LocalDate today = testDate.plus(differenceInDays, ChronoUnit.DAYS)
不要尝试手动将包含年、月和日组件的Period 转换为整数天数。正确答案取决于所涉及的日期,这就是为什么我们要让LocalDate API 为我们计算它。
当精度不重要时
根据您的 cmets,精度对您来说不是问题,因为您只想将某人的年龄显示为最接近的四分之一年左右。您不是在尝试表示准确的时间差异;只是一个近似值,误差较大。您也不需要能够执行任何往返计算。这大大改变了事情。
类似@VGR 的近似值对于这些目的应该绰绰有余:“年数”应该精确到 3 天内(double ;)。
@Oleg 的方法也很有效,会给你一个整个季度的日期差异,你可以将它除以 4 以转换为年份。这可能是最简单的解决方案,因为您不需要舍入或截断结果。我认为,这是最接近您从java.util.time 获得直接解决方案的方法。 Java Time API(以及一般的日期/时间 API)是为正确性而设计的:它们会为您提供完整的单位,但由于浮动涉及的固有错误,它们通常会避免为您提供小数近似值-点类型(也有例外,例如 .NET 的 System.TimeSpan)。
但是,如果您的目标是向人类用户显示某人的年龄,并且您希望比整年更精确,我认为18 years, 9 months(或类似18 yr, 9 mo 的缩写形式)比18.75 years 更好。