代码之家  ›  专栏  ›  技术社区  ›  Archimedes Trajano

使用Java Time API获取月龄

  •  0
  • Archimedes Trajano  · 技术社区  · 5 年前

    我编写了一个简单的时间API调用,以获取两个月之间的月数和年数 LocalDate 然而,当我做测试时,这些数字似乎计算不正确。

    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));
    

    更新:我在断言上犯了一个错误。所以我把它们修好了。

    1 回复  |  直到 5 年前
        1
  •  2
  •   Anonymous    5 年前

    我的版本可能是:

    public int getAgeInMonths(LocalDate processingDate) {
        return Math.toIntExact(ChronoUnit.MONTHS.between(dateOfBirth, processingDate));
    }
    

    出于品味,我发现声明参数是完全多余的 final . 方法是否修改参数是与方法签名无关的实现细节。

    我更喜欢 Math.toIntExact 作为一种更安全的方式 long int . 它将抛出一个异常,以防int溢出。

    另外,作为一个品味问题,当我们只对几个月感兴趣时,我们不需要经历 Period 上课。

        2
  •  1
  •   Archimedes Trajano    5 年前

    这是最后的结果

    public int getAge(final LocalDate processingDate) {
    
        return Period.between(dateOfBirth, processingDate).getYears();
    }
    
    public int getAgeInMonths(final LocalDate processingDate) {
    
        return (int) Period.between(dateOfBirth, processingDate).toTotalMonths();
    
    }