我想从日历选择中选择一个日期,以使用selenium webdriver自动化我的应用程序。
我使用的是SimpleDateFormat
类,它支持不同类型的日期格式。但我不确定"14 Jun, Wed"
之类的日期需要采用哪种格式,而这些日期不属于dd/mm/yyyy
或任何其他可用格式。
答案 0 :(得分:1)
SimpleDateFormat format=new SimpleDateFormat("dd MMM, EEE");
参考:https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html
答案 1 :(得分:1)
要获取星期几,您可以使用java.util.Calendar
:
Calendar c = Calendar.getInstance();
c.setTime(yourDate);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
由于您需要'Wed'而不是4(星期几从1开始编制索引),而不是通过日历,只需重新格式化字符串:new SimpleDateFormat("EE").format(date)
(EE表示“星期几,短版本” “)。
要在字符串中获取当前月份,请通过以下方式调用此函数:
String month = getMonthForInt(Calendar.getInstance().get(Calendar.MONTH))
//**********************************************************************
String getMonthForInt(int num) {
String month = "wrong";
DateFormatSymbols dfs = new DateFormatSymbols();
String[] months = dfs.getMonths();
if (num >= 0 && num <= 11 ) {
month = months[num];
}
return month;
}
然后以你想要的格式连接两个字符串。
答案 2 :(得分:1)
您是否考虑过使用新的日期/时间API?旧类(Date
,Calendar
和SimpleDateFormat
)有lots of problems,并且它们将被新API替换。
如果您使用 Java 8 ,请考虑使用new java.time API。它更容易,less bugged and less error-prone than the old APIs。
如果您正在使用 Java&lt; = 7 ,则可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。对于 Android ,ThreeTenABP(更多关于如何使用它here)。
以下代码适用于两者。
唯一的区别是包名称(在Java 8中为java.time
而在ThreeTen Backport(或Android的ThreeTenABP中)为org.threeten.bp
),但类和方法名称是一样的。
首先,您需要创建DateTimeFormatter
以匹配格式14 Jun, Wed
。因此,我们需要使用此模式(日/月/工作日)创建格式化程序。由于月份名称和工作日是英语,因此即使您的系统的默认语言环境不是英语,我们也会使用java.util.Locale
类来确保其有效。
还有另一个问题:采用这种格式(14 Jun, Wed
),没有年。所以我们有两种选择:
14 Jun, Tue
,我们需要找到一年中&#34; 14君&#34;是星期二(因此,我们不能假设它总是当年)。我正在为两者编写代码。在此解析中,我使用LocalDate
类,因为它似乎是您案例的最佳选择(此类表示日期,月份和年份的日期):
String input = "14 Jun, Wed";
// alternative 1: formatter assuming it's always the current year
DateTimeFormatter formatter1 = new DateTimeFormatterBuilder()
// pattern matching day/month/weekday
.appendPattern("dd MMM, EEE")
// assume current year as default
.parseDefaulting(ChronoField.YEAR, Year.now().getValue())
// use English locale (to make sure month and weekday are parsed correctly)
.toFormatter(Locale.ENGLISH);
LocalDate dt = LocalDate.parse(input, formatter1);
System.out.println(dt); // 2017-06-14
// alternative 2: parse day and month, find a year that matches the weekday
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("dd MMM, EEE", Locale.ENGLISH);
// get parsed object (think of this as an intermediary object that contains all the parsed fields)
TemporalAccessor parsed = formatter2.parse(input);
// get the current year
int year = Year.now().getValue();
// get the parsed weekday (Wednesday)
DayOfWeek weekday = DayOfWeek.from(parsed);
// try a date with the parsed day and month, at this year
MonthDay monthDay = MonthDay.from(parsed);
dt = monthDay.atYear(year);
// find a year that matches the day/month and weekday
while (dt.getDayOfWeek() != weekday) {
// I'm going to previous year, but you can choose to go to the next (year++) if you want
year--;
dt = monthDay.atYear(year);
}
System.out.println(dt); // 2017-06-14
两者的输出是:
2017年6月14日
请注意,如果输入为14 Jun, Tue
,则替代1将抛出异常(因为工作日与当前年份匹配)和备选2(代码启发(不是说复制){ {3}})将查找与工作日匹配的一年(在这种情况下,它会找到2016-06-14
)。
由于不清楚您想要的替代方案,只需根据您的使用情况选择一个。
输出格式(2017-06-14
)是LocalDate.toString()
的结果。如果要更改它,只需创建另一个格式化程序:
// create formatter with another format for output
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
System.out.println(outputFormatter.format(dt)); // 14/06/2017
对于上面的示例,输出为:
14/06/2017
您可以查看this answer以获取有关可用格式的更多详细信息。