我想获得特定月份的工作天数
就我而言,周末的日子是星期五和星期六
我使用此代码:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class TestWeekDay {
/**
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
String dateInString = "01-07-2016";
Date startDate = sdf.parse(dateInString);
String dateInString2 = "31-07-2016";
Date endDate = sdf.parse(dateInString2);
calculateDuration(startDate,endDate);
}
public static int calculateDuration(Date startDate, Date endDate)
{
Calendar startCal = Calendar.getInstance();
startCal.setTime(startDate);
Calendar endCal = Calendar.getInstance();
endCal.setTime(endDate);
int workDays = 0;
if (startCal.getTimeInMillis() > endCal.getTimeInMillis())
{
startCal.setTime(endDate);
endCal.setTime(startDate);
}
do
{
startCal.add(Calendar.DAY_OF_MONTH, 1);
if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY && startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY)
{
workDays++;
}
}
while (startCal.getTimeInMillis() <= endCal.getTimeInMillis());
return workDays;
}
}
当我测试7月份的例子时,我 22 ,正确的答案应 21
答案 0 :(得分:3)
如果在if
语句后添加以下行,您将看到问题。
System.out.printf("%s %d%n", new SimpleDateFormat("yyyy-MM-dd EEE").format(startCal.getTime()), workDays);
BTW:这叫做调试。
输出
2016-07-02 Sat 0
2016-07-03 Sun 1
2016-07-04 Mon 2
2016-07-05 Tue 3
2016-07-06 Wed 4
2016-07-07 Thu 5
2016-07-08 Fri 5
2016-07-09 Sat 5
2016-07-10 Sun 6
2016-07-11 Mon 7
2016-07-12 Tue 8
2016-07-13 Wed 9
2016-07-14 Thu 10
2016-07-15 Fri 10
2016-07-16 Sat 10
2016-07-17 Sun 11
2016-07-18 Mon 12
2016-07-19 Tue 13
2016-07-20 Wed 14
2016-07-21 Thu 15
2016-07-22 Fri 15
2016-07-23 Sat 15
2016-07-24 Sun 16
2016-07-25 Mon 17
2016-07-26 Tue 18
2016-07-27 Wed 19
2016-07-28 Thu 20
2016-07-29 Fri 20
2016-07-30 Sat 20
2016-07-31 Sun 21
2016-08-01 Mon 22
22
如您所见,您有两个问题:
我会留给你找出解决方案。祝你好运。
答案 1 :(得分:1)
我认为您的问题可能是由边界条件引起的,这导致在评估之前每个月添加一天。在增加实际日期之前,请尝试一周检查第一个。
while (startCal.getTimeInMillis() <= endCal.getTimeInMillis()) {
if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY &&
startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
workDays++;
}
startCal.add(Calendar.DAY_OF_MONTH, 1);
}
答案 2 :(得分:1)
Calendar cal = Calendar.getInstance();
/* set the 1st date of ongoing month */
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 1, 0, 0, 1);
Calendar cal1 = Calendar.getInstance();
/* set the last date of ongoing month */
cal1.set(cal1.get(Calendar.YEAR), cal1.get(Calendar.MONTH), cal1.getMaximum(Calendar.DAY_OF_MONTH), 23, 59, 59);
int workingDays = 0;
/* run the while loop until the months are same */
while (cal.get(Calendar.MONTH) != cal1.get(Calendar.MONTH)) {
if (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY
&& cal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
System.out.println("Check >> "+ cal.getTime());
workingDays++;
}
cal.add(Calendar.DAY_OF_MONTH, 1);
}
System.out.println(workingDays);
答案 3 :(得分:0)
使用这段代码,只需运行循环,直到条件jQuery(document).ready(function(){
alert(jQuery('#saveForm #rname').attr('id'));
});
返回false。
startCal after endCal
答案 4 :(得分:-1)
将您的while条件中的&lt; =替换为&lt;如下所示 -
while (startCal.getTimeInMillis() < endCal.getTimeInMillis());
这会产生问题,因为对于该月的最后一天,您的条件(最初使用&lt; =)返回true,因为最终在将startCal递增1天后,它变为等于某一点的endCal。由于变得相等,您的以下行将在do
中执行startCal.add(Calendar.DAY_OF_MONTH, 1);
因此下一个日期是四月一日,即星期一。因此,这也会被添加到工作日列表中。
注意 - 请按照@Andreas评论调试您的代码。通过一些调试,您可以轻松找到问题。再次调试代码对开发人员来说非常重要。 你不能忽视它!
正如@Andreas正确指出的那样,这个月的第一天也不会受到检查。为了检查第一天,您需要先比较第一天,然后将第一天增加1.以下是代码 -
do
{
if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY && startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY)
{
workDays++;
}
startCal.add(Calendar.DAY_OF_MONTH, 1); //Moved this line to last of do block
}
while (startCal.getTimeInMillis() < endCal.getTimeInMillis());