java - Selenium 将工作日添加到日期,周末计算不正确

标签 java weekday java.util.calendar date

我在 6/7/2018 上运行以下代码,以便从返回的任何日期中省略周末。然而,代码似乎将以下几天确定为周末。

13/7/2018 - Friday & 14/7/2018 - Saturday

而不是

14/7/2018 - Saturday & 15/7/2018 - Sunday

我正在更新指示的字段以增加/减少我想要选择的 future 天数。

如果我输入 5 天,返回的日期是 12/7/2018,如果我输入 6 天,返回的日期是 15/7/2018

我是否遗漏了一些明显的东西,我们将不胜感激。

Date date=new Date();
Calendar calendar = Calendar.getInstance();
date=calendar.getTime(); 
SimpleDateFormat s;
s=new SimpleDateFormat("dd/MM/yyyy");

System.out.println(s.format(date));

int days = 5; //I am updating this value to increase and decrease days
for(int i=0;i<days;)
{
    calendar.add(Calendar.DAY_OF_MONTH, 1);

    //here even sat and sun are added
    //but at the end it goes to the correct week day.
    //because i is only increased if it is week day

    if(calendar.get(Calendar.DAY_OF_WEEK)<=5)
    {
        i++;
    }

}
date=calendar.getTime(); 
s=new SimpleDateFormat("dd/MM/yyyy");
System.out.println(s.format(date));

最佳答案

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
            .withLocale(Locale.UK);
    LocalDate date = LocalDate.now(ZoneId.of("Pacific/Truk"));
    System.out.println(date.format(dateFormatter));
    int days = 5;

    int i = 0;
    while (i < days) {
        date = date.plusDays(1);
        DayOfWeek day = date.getDayOfWeek();
        if (! day.equals(DayOfWeek.SATURDAY) && ! day.equals(DayOfWeek.SUNDAY)) {
            i++;
        }
    }
    System.out.println(date.format(dateFormatter));

今天(7 月 8 日星期日)的输出:

08/07/2018
13/07/2018

7 月 13 日是下周五,所以显然没有把周五当作周末。

Is there something obvious I am missing(?)

它认为这不是那么明显:Calendar 类对一周中的几天进行编号,从 1 代表星期日到 7 代表星期六。这来自美国人对周的理解。因此,当您的条件是星期几应小于或等于 5 时,您包括星期日 (1) 到星期四 (5),并过滤掉星期五 (6) 和星期六。

…if you could point me in the right direction to the documentation…

要在文档中找到此信息,您必须在每个常量下查看星期几、SUNDAY 等,然后点击常量字段值链接。请参阅此答案底部的链接。

Calendar 类已被证明设计不佳(尽管尝试修复 Date 的问题)并且现在也早已过时。相反,我建议您使用现代 Java 日期和时间 API java.time。我当然会在上面的代码片段中这样做。

Calendar 的许多问题之一是使用 int 表示星期几(以及其他具有名称而不是数字的项目)。这是不自然的,很容易混淆。有人可能会说您通过与 5 而不是 Calendar.FRIDAY 进行比较来强化问题,但是由于美国编号,后者也不会解决您的问题。 java.timeDayOfWeek 是一个枚举,不会邀请使用“小于”或“早于”进行比较(尽管您可以,并且它可以在你的情况)。引用命名常量 SATURDAYSUNDAY 的代码不仅更清晰易读,而且更不容易出错。

链接

关于java - Selenium 将工作日添加到日期,周末计算不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51211668/

相关文章:

c# - 在c#中抛出异常

java - 在 struts.xml 中使用插件阻止运行应用程序

Java:GregorianCalendar 奇怪的输出

java - 需要使用struts tagLib在jsp中显示HTML

java - 媒体投影需要 ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION 类型的前台服务

php 使用简单的 strtotime 每月的第一个和最后一个工作日(可行的周一至周五)

excel - 在 COUNTIFS 中使用 WEEKDAY 函数

mysql - 如何使用MySQL获取最后一个星期日和最后一个星期日之前的星期日?

java - 没有毫秒的日历与毫秒为 0 的日历

java - Calendar#add(Calendar.MONTH, months) 和 LocalDate#plusMonth(months) 之间有什么不同的行为吗?