日期选择器前一天的第一天和最后一天

Date picker first and last day of previous

谁能帮我从日期选择器中找到上个月的第一天和最后一天。 实现了当前日期和当月 1 日的取货,具有以下条件:

// Choose today's date
    String today =  LocalDate.now().format(DateTimeFormatter.ofPattern("dd/MM-YYYY"));
    driver.findElement(By.xpath("//*[@id=\"viewPeriodStart\"]")).clear();
    driver.findElement(By.xpath("//*[@id=\"viewPeriodStart\"]")).sendKeys(today);
    //Choose first of a month
    String firstDayinMOnth = LocalDate.now().format(DateTimeFormatter.ofPattern("01/MM-YYYY"));
    driver.findElement(By.xpath("//*[@id=\"viewPeriodEnd\"]")).clear();
    driver.findElement(By.xpath("//*[@id=\"viewPeriodEnd\"]")).sendKeys(firstDayinMOnth + Keys.ENTER);
    Thread.sleep(8000);
    driver.findElement(By.xpath("//*[@id=\"calenderShowHide\"]/div/input[3]")).click();

但不知道如何创建上个月的第一天和最后一个月。 提前谢谢你

已解决,经过一些谷歌搜索和检查:

String lastDay = LocalDate.now().withDayOfMonth(1).minusDays(1).format(DateTimeFormatter.ofPattern("dd/MM-YYYY"));
String firstDay = LocalDate.now().withDayOfMonth(1).minusDays(1).withDayOfMonth(1).format(DateTimeFormatter.ofPattern("dd/MM-YYYY"));

这些要点不是你问的,但相信对你还是有帮助的建议。

  1. 考虑半开区间。
  2. 为了保持一致性,只阅读 LocalDate.now() 一次。
  3. 给出你想要的时区。
  4. 不要在格式模式字符串中使用大写 YYYY

半开:很自然地认为一个月的天数是从第一天到最后一天包括。但是,标准处理将从本月的第一天 inclusive 到下个月的第一天 exclusive。还是一样的日子,只是表现形式不同。特别是当你处理连续的月份时,这提供了简单性并防止了错误:当你有这个月的第一天时,你不需要上个月的最后一个。而且你不可能错误地在两个时期之间划出一个空白。

只读一次今天的日期。如果您的代码恰好在 运行 午夜时分,您可以接受您无法控制它是否使用 [=] 之前的日期67=] 或之后的日期,但您要确保它不会同时用于不同的日期计算,否则您可能会面临日期不一致的风险,例如属于同一个月而不是上个月和本月的所有日期。

给一个时区:地球上所有时区的日期永远不会相同。因此,需要一个时区来确定今天的日期或当前月份。明确说明。即使你想要 ZoneId.systemDefault(),写下它来强迫自己做出有意识的决定,并告诉 reader 你已经这样做了。

    LocalDate today = LocalDate.now(ZoneId.of("Europe/Belgrade"));
    LocalDate firstDayOfCurrentMonth = today.withDayOfMonth(1);
    LocalDate lastDayOfCurrentMonth = today.with(TemporalAdjusters.lastDayOfMonth());
    YearMonth lastMonth = YearMonth.of(today.getYear(), today.getMonth())
                            .minusMonths(1);
    LocalDate firstDayOfLastMonth = lastMonth.atDay(1);
    LocalDate lastDayOfLastMonth = lastMonth.atEndOfMonth();

YearMonth 是日历中的一个月,例如 1940 年 4 月2018 年 2 月。一年零一个月。我故意在代码中有点不一致。在生产代码中,您可能希望通过 YearMonth 个对象或其中的 none 个来处理本月和上个月。但我会向您展示这两种选择,以便您做出选择。如果您想要当前月份,请使用 YearMonth.now(ZoneId)

最后一点:格式模式字符串YYYY。这是格式化程序的正确版本:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM-uuuu");

如果我明年 1 月 运行 我的代码而不是今天,并使用大写的格式化程序 YYYY,我得到的上个月是 01/12-2018 到 31/12-2019。它应该是 31/12-2018,但那个日期属于 2019 年的第 1 周,这就是 YYYY 给你的。而是使用 uuuu 或小写 yyyy.