Как получить первые три даты следующего месяца с помощью java

Я разрабатываю платформу автоматизации пользовательского интерфейса с использованием webDriver / Selenium и имею сценарий, в котором мне нужно получить первую, вторую и третью даты (строку) следующего месяца в зависимости от даты (даты), которую я получаю из приложения. например. Если я получаю 29/10/2018 в строке из приложения, тогда мне нужен метод в java, который вернет 01/11/2018 в строке, и если его 30/10/2018, то 02/11/2018 и его 31/10 / 2018, затем 11.03.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;
}

Что ж, если вы ищете лучший способ, первым шагом было бы начать использовать API даты и времени Java 8 вместо устаревшего подхода. Второй шаг, вероятно, заключался бы в том, чтобы исключить общую логику, которая у вас есть во всех трех методах, и поместить ее в отдельный метод.

Robby Cornelissen 07.11.2018 15:00

Вы должны объяснить логику, связывающую первые даты с датами результатов. Основан ли он на минусе последнего дня месяца, предпоследнего дня и т. д.?

Basil Bourque 07.11.2018 17:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
599
3

Ответы 3

Вы можете использовать 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

Я думаю это полезно

Как уже указывалось, вам действительно следует использовать Дата / время API, доступный с Java 8. Более конкретно, вы должны использовать LocalDate вместе с DateTimeFormatter для преобразования между текстом и датой.

Итак, давайте рассмотрим это по шагам. Рассмотрим следующий форматтер:

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]

Для этого можно использовать Java 8. Я рекомендую создать один метод с параметром dayOfMonthOffset, который вы можете передать, если хотите 1-го, 2-го или 10-го числа следующего месяца. Ниже приведен код:

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 для анализа введенной даты (заданной в формате дд / ММ / гггг), корректируем месяц с помощью TemporalAdjusters, а затем используем withDayOfMonth, чтобы установить, какой день следующего месяца мы хотим.

Спасибо за ваше предложение. Я вижу "ofPattern (" dd / MM / yyyy ") красным цветом в строке кода ниже. Как решить эту проблему. DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy");

Ref 08.11.2018 11:04

Нашел проблему. Это происходит, поскольку я уже использовал joda-time, поэтому это противоречиво. Интересно, могу ли я реализовать тот же метод, используя вместо этого Joda-time

Ref 08.11.2018 12:31

Другие вопросы по теме