java.time.Period,划分句点会产生错误的结果

时间:2017-08-27 12:36:04

标签: java time period localdate

我累了使用java.time.Period,结果与我手动计算的结果相差三天。 这里奇怪的是当我将句号分成两个句点时,结果与我的手动计算相符。

第二种方法就像我手动计算周期一样。

我错过了什么吗?是否有日历算法的标准方法或算法?什么是java.time.Period使用的算法?

import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;

public class test2 {

    public static void main(String[] args) {

        LocalDate d1 = LocalDate.of(2014, 2, 14);
        LocalDate d2 = LocalDate.of(2017, 8, 1);

        Period p = Period.between(d1, d2);

        //using period between the two dates directly
        System.out.println("period between " + d1.toString() + " and " + d2.toString() + " is " + p.getYears()
                + " years " + p.getMonths() + " months " + p.getDays() + " Days");

        //dividing the period into two parts 
        p = Period.between(LocalDate.of(2014, 3, 1), d2);

        System.out
                .println("period between " + d1.toString() + " and " + d2.toString() + " is " + p.getYears() + " years "
                        + p.getMonths() + " months " + d1.until(LocalDate.of(2014, 3, 1), ChronoUnit.DAYS) + " Days");

    }
}

3 个答案:

答案 0 :(得分:1)

您可以在此处执行两项不同的操作:

Period p = Period.between(d1, d2)

为您提供了一种很好的格式化方法来输出这些日期之间的差异(您已正确使用了格式选项)。

d1.until(d2, ChronoUnit.DAYS) 

会给你相同的 - 但不太合适(基本上它只给你LocalDates之间的天数)。

答案 1 :(得分:0)

答案(2014-02-14至2017-08-01期间为3年5个月18天)是您应该期待的:

  • 2014-02-142017-02-14
  • 的3年
  • 2017-02-142017-07-14
  • 的5个月
  • 2017-07-142017-08-01
  • 的18天

计算从几年到几个月到几天。这样,您就可以计算2014-02-142016-02-29之间的年数,月数和天数,分别为2年和15天。

如果您首先尝试计算天数,那么在确定2014-02-142016-02-29之间的年数,月数和天数时会遇到问题,因为没有一天2014-02-29 - 14天之后2014-02-14 2014-02-28 2014-02-142014-03-01 number summary cleanSummary 0 1-123 he loves ice cream love ice cream 1 1-234 she loves ice love ice 2 1-345 i hate avocado hate avocado 3 1-123 i like skim milk like skim milk 后的number

答案 2 :(得分:0)

您无法像以往一样划分日期差,因为期间计算取决于相关日期的月/年。在您的示例中,

2月14日 2014年3月1日之间的时间段仅为 15天

2月14日 2017年8月1日之间的时间段是从 2017年7月14日到< strong> 2017年8月1日,将为 18天,详细信息:

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC



driver = webdriver.Chrome()

wait = WebDriverWait(driver, 10)



def expand_shadow_root(element):

    shadow_root = driver.execute_script("return arguments[0].shadowRoot", element)

    return shadow_root


root1 = driver.find_element_by_tag_name("print-preview-button-strip")

shadow_root1 = expand_shadow_root(root1)

btn = shadow_root1.find_element_by_xpath("/html/body/print-preview-app//print-preview-sidebar//print- 
preview-button-strip//cr-button[1]")

wait.until((EC.element_to_be_clickable(By.XPATH,"/html/body/print-preview-app//print-preview- 
sidebar//print-preview-button-strip//cr-button[1]")))

btn.click()

这意味着用 2014年3月代替 2017年8月来独立于整个日期计算天差会导致答案不正确( 15 应该是 18天)。

因此,如果您要进行任何手动计算而不仅仅是其1) 14/02/2014 -> 14/02/2017: 3 years 2) 14/02/2017 -> 14/07/2017: 5 months 3) 14/07/2017 -> 01/08/2017: 18 days 部分,或者只是简单安全地使用{{1},则可能需要考虑整个日期。 }给予Inspect Element print的类来执行所需的日期计算。