我正在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));
答案 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}}是一个枚举,不建议使用“小于”或“在...之前”进行比较(尽管您可以,但在您的情况下可以使用)。引用命名常量DayOfWeek
和SATURDAY
的代码不仅更易于阅读,而且更不易出错。