硒将日期添加到工作日,周末的天数计算不正确

时间:2018-07-06 13:37:45

标签: java date weekday java.util.calendar java-date

我正在6/7/2018上运行以下代码,以便从返回的任何日期中忽略周末。但是,代码似乎将以下日期确定为周末。

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

而不是

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

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

如果我输入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));

1 个答案:

答案 0 :(得分:3)

    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日是下周五,因此显然没有以周五为周末。

  

我是否有明显的遗漏(?)

似乎并不那么明显:Calendar类将星期几从1的星期日数到7的星期六数。这来自美国人对几周的理解。因此,当您的条件是星期几应小于或等于5时,您将星期日(1)到星期四(5)包括在内,并过滤掉星期五(6)和星期六。

  

...如果您可以向我指出文档的正确方向...

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

事实证明Calendar类的设计不佳(尽管试图解决Date的问题),但现在也已经过时了。相反,我建议您使用java.time(现代Java日期和时间API)。我当然在上面的代码段中做了。

Calendar的许多问题之一是在一周中的某天使用int(以及其他具有名称而不是数字的项目)。这是不自然的,而且很容易混淆。有人可能会说,您通过比较5而不是Calendar.FRIDAY来强调问题,但是由于美国编号,后者也无法解决您的问题。 java.time的{​​{1}}是一个枚举,不建议使用“小于”或“在...之前”进行比较(尽管您可以,但在您的情况下可以使用)。引用命名常量DayOfWeekSATURDAY的代码不仅更易于阅读,而且更不易出错。

链接