代码之家  ›  专栏  ›  技术社区  ›  Angelina

ChronoUnit.Months.不遵循半开放式方法

  •  0
  • Angelina  · 技术社区  · 6 年前

    我有2个 LocalDate 我想找出以下两者之间的区别:

    LocalDate date1 = LocalDate.of(2018,11,30);
    LocalDate date2 = LocalDate.of(2019, 5, 1);
    

    当我执行:

    long mthsDiff = ChronoUnit.MONTHS.between(date1, date2);
    

    这返回5,但实际上应该是6。

    为什么是 ChronoUnit.MONTHS.between 不尊重 Half-Open approach ?它不是应该回到四月吗( 2019-04-30 )? 我错过什么了吗?

    我明白第二个论点是排他性的。 以下是我期望的场景:

    date1 = 2018-11-16
    date2 = 2019-04-15
    expect 5
    
    date1 = 2018-11-16
    date2 = 2019-04-16
    expect 5
    
    date1 = 2018-11-16
    date2 = 2019-04-17
    expect 6
    
    date1 = 2018-11-16
    date2 = 2019-04-15
    expect 5
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Michael    6 年前

    我想 the documentation 这里说的都是:

    计算返回一个整数,表示 完整单位 在两个时间段之间。例如,金额 从11:30到13:29之间的时间将仅为1小时 两小时少一分钟。

    11月30日至5月1日整月为5个月:

    1. 十二月
    2. 一月
    3. 二月
    4. 三月
    5. 四月

    你为什么认为应该是6?半开放只是说第一天是包容的,最后一天是排他的。除去5月1日没有任何作用,4月的所有时间都在这个范围内。包括11月30日还不到一个月,所以还是5个月。

        2
  •  2
  •   azro    6 年前

    正如医生所说 ChronoUnit.between

    计算返回一个整数,表示两个时间段之间的完整单元数。

    // these two lines are equivalent
    between = thisUnit.between(start, end);
    between = start.until(end, thisUnit);
    

    所以有5个完整的月

    "2018-11-30"
    December -> 1
    January  -> 2
    February -> 3
    March    -> 4
    May      -> 5
    "2019-05-01"
    
    推荐文章