如何使用java获取下个月的前三个日期

如何使用java获取下个月的前三个日期,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我正在使用webDriver/Selenium开发UI自动化框架,并且有一个场景,在这个场景中,我需要根据从应用程序获取的日期(date)获取下个月的第一、第二和第三个日期(字符串)。e、 g..如果我从应用程序中获得2018年10月29日的字符串,那么我需要一个java方法,该方法将返回2018年11月1日的字符串,如果是2018年10月30日的字符串,则返回2018年11月2日的字符串,如果是2018年10月31日的字符串,则返回2018年11月3日的字符串。目前,我已经准备了三种方法来返回

我正在使用webDriver/Selenium开发UI自动化框架,并且有一个场景,在这个场景中,我需要根据从应用程序获取的日期(date)获取下个月的第一、第二和第三个日期(字符串)。e、 g..如果我从应用程序中获得2018年10月29日的字符串,那么我需要一个java方法,该方法将返回2018年11月1日的字符串,如果是2018年10月30日的字符串,则返回2018年11月2日的字符串,如果是2018年10月31日的字符串,则返回2018年11月3日的字符串。目前,我已经准备了三种方法来返回下个月的前三个日期,这对我很有用,但我相信还有更好的方法。我做这件事的方式如下。请帮忙

非常感谢,, 参考号


您可以使用Java8时间api 以下是一个例子:

 public static List<LocalDate> getLocalDate(final LocalDate localDate) {
        final LocalDate localDateStartingWithNextMonth = 
                  localDate.with(TemporalAdjusters.firstDayOfNextMonth());
   return IntStream.range(0, 3)
                .boxed().map(localDateStartingWithNextMonth::plusDays)
                .collect(Collectors.toList());
    }

      List<LocalDate> localDate = getLocalDate(LocalDate.of(2018, 10, 29));

我认为这很有帮助

您可以使用Java8时间api 以下是一个例子:

 public static List<LocalDate> getLocalDate(final LocalDate localDate) {
        final LocalDate localDateStartingWithNextMonth = 
                  localDate.with(TemporalAdjusters.firstDayOfNextMonth());
   return IntStream.range(0, 3)
                .boxed().map(localDateStartingWithNextMonth::plusDays)
                .collect(Collectors.toList());
    }

      List<LocalDate> localDate = getLocalDate(LocalDate.of(2018, 10, 29));

我认为这很有帮助

正如前面所指出的,您确实应该使用Java 8提供的。更具体地说,您应该将与一起用于文本和日期之间的转换

让我们分步骤来做。考虑下面的格式化程序:

private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy");
这使您可以轻松地在
LocalDate
和字符串之间进行转换

private static LocalDate stringToLocalDate(String dateAsString) {
  return LocalDate.parse(dateAsString, FORMATTER);
}
上述方法将字符串格式的日期转换为
LocalDate

private static List<String> localDatesToString(List<LocalDate> dates) {
  return dates.stream().map(FORMATTER::format).collect(toList());
}
private静态列表localDatesToString(列表日期){
返回日期.stream().map(格式化程序::格式).collect(toList());
}
上面的方法与此相反,只是它在列表上迭代并将日期转换为字符串格式

private static List<LocalDate> firstThreeDaysNextMonth(LocalDate date) {
  final LocalDate startOfNextMonth = date.plusMonths(1).withDayOfMonth(1);
  return IntStream.rangeClosed(0, 2).mapToObj(startOfNextMonth::plusDays).collect(toList());
}
private static List firstThreeDaysNextMonth(LocalDate){
最终LocalDate startOfNextMonth=日期加个数(1)。带个月数(1);
返回IntStream.rangeClosed(0,2).mapToObj(startOfNextMonth::plusDays).collect(toList());
}
上述方法返回下个月的前三天。代码很容易理解,但首先我们计算下个月的第一天。然后,我们对0、1和2进行流式处理,并将每个数字添加到该日期

最后,此主要方法演示了三种方法的用法:

public static void main(String[] args) {
  final String dateAsString = "29/10/2018";
  LocalDate date = stringToLocalDate(dateAsString);
  List<LocalDate> firstThreeDaysNextMonth = firstThreeDaysNextMonth(date);
  List<String> firstThreeDaysNextMonthAsStrings = localDatesToString(firstThreeDaysNextMonth);
  System.out.println(firstThreeDaysNextMonthAsStrings);
}
publicstaticvoidmain(字符串[]args){
最终字符串dateAsString=“29/10/2018”;
LocalDate日期=stringToLocalDate(dateAsString);
列出first3daysnextmonth=first3daysnextmonth(日期);
列出firstthreedaysnextmonthstrings=localDatesToString(firstThreeDaysNextMonth);
System.out.println(前三天下月字符串);
}
它输出:

[2018年11月1日、2018年11月2日、2018年11月3日]


正如已经指出的,您确实应该使用自Java8以来可用的。更具体地说,您应该将与一起用于文本和日期之间的转换

让我们分步骤来做。考虑下面的格式化程序:

private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy");
这使您可以轻松地在
LocalDate
和字符串之间进行转换

private static LocalDate stringToLocalDate(String dateAsString) {
  return LocalDate.parse(dateAsString, FORMATTER);
}
上述方法将字符串格式的日期转换为
LocalDate

private static List<String> localDatesToString(List<LocalDate> dates) {
  return dates.stream().map(FORMATTER::format).collect(toList());
}
private静态列表localDatesToString(列表日期){
返回日期.stream().map(格式化程序::格式).collect(toList());
}
上面的方法与此相反,只是它在列表上迭代并将日期转换为字符串格式

private static List<LocalDate> firstThreeDaysNextMonth(LocalDate date) {
  final LocalDate startOfNextMonth = date.plusMonths(1).withDayOfMonth(1);
  return IntStream.rangeClosed(0, 2).mapToObj(startOfNextMonth::plusDays).collect(toList());
}
private static List firstThreeDaysNextMonth(LocalDate){
最终LocalDate startOfNextMonth=日期加个数(1)。带个月数(1);
返回IntStream.rangeClosed(0,2).mapToObj(startOfNextMonth::plusDays).collect(toList());
}
上述方法返回下个月的前三天。代码很容易理解,但首先我们计算下个月的第一天。然后,我们对0、1和2进行流式处理,并将每个数字添加到该日期

最后,此主要方法演示了三种方法的用法:

public static void main(String[] args) {
  final String dateAsString = "29/10/2018";
  LocalDate date = stringToLocalDate(dateAsString);
  List<LocalDate> firstThreeDaysNextMonth = firstThreeDaysNextMonth(date);
  List<String> firstThreeDaysNextMonthAsStrings = localDatesToString(firstThreeDaysNextMonth);
  System.out.println(firstThreeDaysNextMonthAsStrings);
}
publicstaticvoidmain(字符串[]args){
最终字符串dateAsString=“29/10/2018”;
LocalDate日期=stringToLocalDate(dateAsString);
列出first3daysnextmonth=first3daysnextmonth(日期);
列出firstthreedaysnextmonthstrings=localDatesToString(firstThreeDaysNextMonth);
System.out.println(前三天下月字符串);
}
它输出:

[2018年11月1日、2018年11月2日、2018年11月3日]


您可以使用Java8来实现这一点。我建议创建一个参数为
dayOfMonthOffset
的方法,如果您希望在下个月的第一、第二或第十天传递该参数。代码如下:

public static String getDayOfNextMonth(int dayOfMonthOffset, String inDate) 
{
    DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy");
    LocalDate date = LocalDate.parse(inDate, format)
            .with(TemporalAdjusters.firstDayOfNextMonth())
            .withDayOfMonth(dayOfMonthOffset);

    return date.format(format);
}

在本例中,我们使用该类来解析输入的日期(以dd/MM/yyyy的格式给出),调整月份,然后使用
withDayOfMonth
来设置下个月的哪一天

您可以使用Java8来实现这一点。我建议创建一个参数为
dayOfMonthOffset
的方法,如果您希望在下个月的第一、第二或第十天传递该参数。代码如下:

public static String getDayOfNextMonth(int dayOfMonthOffset, String inDate) 
{
    DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy");
    LocalDate date = LocalDate.parse(inDate, format)
            .with(TemporalAdjusters.firstDayOfNextMonth())
            .withDayOfMonth(dayOfMonthOffset);

    return date.format(format);
}

在本例中,我们使用该类来解析输入的日期(以dd/MM/yyyy的格式给出),调整月份,然后使用
withDayOfMonth
来设置下个月的哪一天

如果您正在寻找更好的方法,那么第一步就是开始使用Java8日期/时间API,而不是使用传统方法。第二步可能是找出三种方法中的共享逻辑,并将其放在一个单独的方法中。您应该解释将第一个日期与结果日期连接起来的逻辑。它是基于月的最后一天,紧接着最后一天的减号,等等吗?好吧,如果您正在寻找更好的方法,第一步是开始使用Java8日期/时间API,而不是使用传统方法。第二步可能是找出三种方法中的共享逻辑,并将其放在一个单独的方法中。您应该解释将第一个日期与结果日期连接起来的逻辑。它是基于月的最后一天,下一个月的最后一天减去,等等吗?谢谢你的建议。我可以在下面的代码行中看到红色的“of模式(“dd/MM/yyyy”)”。如何解决这个问题<代码>日期时间格式