如果我使用以下内容计算LocalDate
中java.time
的{{1}}之间的差异:
Period p = Period.between(testDate, today);
然后我得到一个年数,月数,天数的输出:
Days = 9
Months = 6
Years = 18
有没有人知道一种干净的方式将其表示为十进制类型值(即,上面的内容是18.5...
左右)?
答案 0 :(得分:7)
您在其中一条评论中提到,如果您需要当前季度,则需要四分之一年的精确度IsoFields.QUARTER_YEARS:
<key>NSPhotoLibraryUsageDescription</key>
<string>This app requires access to the photo library.</string>
<key>NSCameraUsageDescription</key>
<string>This app requires access to the camera.</string>
这样你实际上会使用时间api,总是得到正确的结果,@Mike不必厌恶任何东西。
答案 1 :(得分:5)
请不要这样做。
将两个日期之间的差异表示为&#39;年数&#39;乘数是有问题的,因为两个日期之间一年的平均长度取决于您要比较的日期。这很容易弄错,并且很难提出证明你做对了所需的所有测试用例。
大多数程序员不应该手动执行日期/时间计算。您几乎保证错误。说真的,so many ways事情可以horribly wrong。这个星球上只有少数程序员完全理解所涉及的许多细微之处。你问这个问题的事实证明你不是其中之一,而且没关系 - 我也不是。你和我们绝大多数人一样,应该依赖一个坚实的日期/时间API java.util.time
。
如果确实需要一个数字值,那么我能想到的最安全的选项是使用天数,因为LocalDate
API可以为您计算这个数字:
long differenceInDays = testDate.until(today, ChronoUnit.DAYS)
请注意,此差异仅对用于生成它的两个日期有效。往返转换很简单:
LocalDate today = testDate.plus(differenceInDays, ChronoUnit.DAYS)
请勿尝试将包含年,月,日组件的Period
手动转换为整天。正确的答案取决于所涉及的日期,这就是为什么我们想让LocalDate
API为我们计算它。
根据您的评论,精确度对您来说不是一个问题,因为您只希望将某人的年龄显示到最近的四分之一年左右。您并未尝试及时表示完全的差异;只有一个近似值,误差幅度相当大。您也不需要能够执行任何往返计算。这大大改变了事情。
像@ VGR这样的近似值应该足以满足这些目的:&#39;年数&#39;应该准确到3天内(<0.01岁),除非人们开始生活数十万年,在这种情况下你可以切换到double
;)。
@ Oleg的方法也很有效,并且会给你一个整个季度的日期差异,你可以将4
除以转换为年。这可能是最简单的解决方案,因为您不需要舍入或截断结果。我认为,这是最接近java.util.time
的直接解决方案。 Java Time API(以及一般的日期/时间API)是为正确性而设计的:它们会为您提供整个单元,但由于其中涉及的固有错误,它们通常会避免给出小数近似值。浮点类型(有例外,如.NET&#39; s System.TimeSpan
)。
但是,如果你的目标是为人类用户呈现某个人的年龄,并且你想要比整年更精确,我认为18 years, 9 months
(或像18 yr, 9 mo
这样的缩写形式)是比18.75 years
更好的选择。
答案 2 :(得分:4)
我会避免使用Period,而只是计算天数的差异:
float years = testDate1.until(today, ChronoUnit.DAYS) / 365.2425f;