【发布时间】:2019-10-21 22:27:51
【问题描述】:
我编写了我认为简单的时间 API 调用来获取两个 LocalDates 之间的月数和年数。但是,当我进行测试时,数字似乎计算不正确。
https://repl.it/@trajano/LocalDate-Period-Ages?language=java
import java.time.*;
import java.time.temporal.*;
import static org.junit.Assert.assertEquals;
class Main {
public static void main(String[] args) {
{
User user = new User();
user.setDateOfBirth(LocalDate.of(2014, 11, 11));
assertEquals(0, user.getAgeInMonths(LocalDate.of(2014, 11, 11)));
assertEquals(0, user.getAgeInMonths(LocalDate.of(2014, 11, 12)));
assertEquals(0, user.getAgeInMonths(LocalDate.of(2014, 12, 10)));
assertEquals(1, user.getAgeInMonths(LocalDate.of(2014, 12, 11)));
assertEquals(1, user.getAgeInMonths(LocalDate.of(2014, 12, 25)));
assertEquals(1, user.getAgeInMonths(LocalDate.of(2015, 1, 6)));
assertEquals(1 + 12, user.getAgeInMonths(LocalDate.of(2016, 1, 6)));
assertEquals(1 + 12 * 2, user.getAgeInMonths(LocalDate.of(2017, 1, 6)));
assertEquals(1 + 12 * 3, user.getAgeInMonths(LocalDate.of(2018, 1, 6))); }
}
}
class User {
LocalDate dateOfBirth;
public void setDateOfBirth(LocalDate dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
public int getAge(final LocalDate processingDate) {
return (int) Period.between(dateOfBirth, processingDate.plusDays(1)).get(ChronoUnit.YEARS);
}
public int getAgeInMonths(final LocalDate processingDate) {
return (int) Period.between(dateOfBirth, processingDate.plusDays(1)).get(ChronoUnit.MONTHS);
}
public int getAge() {
return getAge(LocalDate.now());
}
public int getAgeInMonths() {
return getAgeInMonths(LocalDate.now());
}
}
我尝试了Period. 和ChronoUnit.MONTHS,但断言失败了。使用来自的代码
Java Time period in decimal number of years
Java 8 Date time for calculating age in decimals
return (int) Period.between(dateOfBirth, processingDate.plusDays(1)).get(ChronoUnit.MONTHS);
和
return (int) ChronoUnit.MONTHS.between(dateOfBirth, processingDate.plusDays(1));
更新:我在断言上犯了一个错误。所以我修复了它们。
【问题讨论】:
-
只是最后四个断言失败了吗?如果我在 11 月 11 日出生,那么到 1 月 6 日我还是一个月大,而不是两个。
-
它在
assertEquals(0, user.getAgeInMonths(LocalDate.of(2014, 12, 10)));开始失败 -
这可能是因为
plusDays(1)- 您计算的年龄是 12 月 11 日,而不是 12 月 10 日。 -
那是因为您在
getAgeInMonths中添加了一天:processingDate.plusDays(1)。你为什么要这么做? -
API 对第二个字段表示“独占”。