Java以十进制年数表示的时间段

时间:2017-10-02 20:44:13

标签: java date java-time period

如果我使用以下内容计算LocalDatejava.time的{​​{1}}之间的差异:

Period p = Period.between(testDate, today);

然后我得到一个年数,月数,天数的输出:

Days = 9
Months = 6
Years = 18

有没有人知道一种干净的方式将其表示为十进制类型值(即,上面的内容是18.5...左右)?

3 个答案:

答案 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;