我正在使用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;
}
答案 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。更具体地说,应该将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]