如何使用Java

时间:2018-11-07 13:58:59

标签: java selenium selenium-webdriver

我正在使用webDriver / Selenium开发UI自动化框架,并且有一种情况,我需要根据从应用程序获得的日期(日期)来获取下个月的第一,第二和第三日期(字符串)。例如,如果我从应用程序中以字符串形式获取29/10/2018,那么我需要一个java中的方法,该方法将以字符串形式返回01/11/2018;如果其返回30/10/2018,则返回02/11/2018及其31/10 / 2018,然后是03/11/2018。目前,我已经准备了三种方法来返回下个月的前三个日期并为我工作,但是我相信有更好的方法。我这样做的方式如下。请帮助

非常感谢, 参考

private String getFirstDayOfNextMonth(String date)
{
    String firstDay = null;
    try
    {
        Date today = new SimpleDateFormat("dd/MM/yyyy").parse(date);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(today);
        calendar.add(Calendar.MONTH, 1);
        calendar.set(Calendar.DAY_OF_MONTH, +1);
        calendar.add(Calendar.DATE, 0);
        Date firstDayOfNextMonth = calendar.getTime();
        DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        firstDay = sdf.format(firstDayOfNextMonth);
    }
    catch (ParseException e)
    {
        Logger log = Logger.getLogger(Thread.currentThread().getName());
        log.error("Not able to return first day of next month", e);
    }
    return firstDay;
}

private String getSecondDayOfNextMonth(String date)
{
    String secondDay = null;
    try
    {
        Date today = new SimpleDateFormat("dd/MM/yyyy").parse(date);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(today);
        calendar.add(Calendar.MONTH, 1);
        calendar.set(Calendar.DAY_OF_MONTH, +1);
        calendar.add(Calendar.DATE, 1);
        Date firstDayOfNextMonth = calendar.getTime();
        DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        secondDay = sdf.format(firstDayOfNextMonth);
    }
    catch (ParseException e)
    {
        Logger log = Logger.getLogger(Thread.currentThread().getName());
        log.error("Not able to return second day of next month", e);
    }
    return secondDay;
}

private String getThirdDayOfNextMonth(String date)
{
    String thirdDay = null;
    try
    {
        Date today = new SimpleDateFormat("dd/MM/yyyy").parse(date);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(today);
        calendar.add(Calendar.MONTH, 1);
        calendar.set(Calendar.DAY_OF_MONTH, +1);
        calendar.add(Calendar.DATE, 2);
        Date firstDayOfNextMonth = calendar.getTime();
        DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        thirdDay = sdf.format(firstDayOfNextMonth);
    }
    catch (ParseException e)
    {
        Logger log = Logger.getLogger(Thread.currentThread().getName());
        log.error("Not able to return third day of next month", e);
    }
    return thirdDay;
}

3 个答案:

答案 0 :(得分:2)

您可以使用Java 8 Time 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));

您将收到响应:

2018-11-01
2018-11-02
2018-11-03

我认为这很有帮助

答案 1 :(得分:2)

您可以使用Java 8执行此操作。我建议创建一个参数为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);
}

在这种情况下,我们使用LocalDate类来解析输入的日期(格式为dd / MM / yyyy),用TemporalAdjusters调整月份,然后使用withDayOfMonth来设置我们要在下个月的哪一天。

答案 2 :(得分:1)

正如已经指出的那样,您确实应该使用Java 8以来可用的Date/Time API。更具体地说,应该将LocalDateDateTimeFormatter一起使用,以在文本和日期之间进行转换。

因此,让我们逐步进行。请考虑以下格式化程序:

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 static List<LocalDate> firstThreeDaysNextMonth(LocalDate date) {
  final LocalDate startOfNextMonth = date.plusMonths(1).withDayOfMonth(1);
  return 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);
}

它输出:

  

[01/11/2018,02/11/2018,03/11/2018]