Я разрабатываю платформу автоматизации пользовательского интерфейса с использованием 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;
}
Вы должны объяснить логику, связывающую первые даты с датами результатов. Основан ли он на минусе последнего дня месяца, предпоследнего дня и т. д.?




Вы можете использовать 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");
Нашел проблему. Это происходит, поскольку я уже использовал joda-time, поэтому это противоречиво. Интересно, могу ли я реализовать тот же метод, используя вместо этого Joda-time
Что ж, если вы ищете лучший способ, первым шагом было бы начать использовать API даты и времени Java 8 вместо устаревшего подхода. Второй шаг, вероятно, заключался бы в том, чтобы исключить общую логику, которая у вас есть во всех трех методах, и поместить ее в отдельный метод.