我的要求是计算给定的两个日期之间的Days数,不包括Saturday和Sunday。
例子:
Start date - 10/09/15 and End date 18/09/15
Result: 7
日期为
DD/MM/YY
格式。
代码:
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;
public class DaysCounter {
private String startDate;
private String endDate;
public void calculateDate(){
@SuppressWarnings("resource")
Scanner in=new Scanner(new InputStreamReader(System.in));
System.out.println("Enter the starting date (DD/MM/YY) :");
startDate=in.next();
System.out.println("Enter the End date (DD/MM/YY) :");
endDate=in.next();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
try
{
Calendar start = Calendar.getInstance();
start.setTime(sdf.parse(startDate));
Calendar end = Calendar.getInstance();
end.setTime(sdf.parse(endDate));
int workingDays = 0;
while(!start.after(end))
{
int day = start.get(Calendar.DAY_OF_WEEK);
if ((day != Calendar.SATURDAY) && (day != Calendar.SUNDAY))
workingDays++;
start.add(Calendar.DATE, 1);
}
System.out.println(workingDays);
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
DaysCounter daysCounter=new DaysCounter();
daysCounter.calculateDate();
}
}
这里是上面代码的结果。
1 -
Enter the starting date (DD/MM/YY) :
14/09/15
Enter the End date (DD/MM/YY) :
20/09/15
5
2 -
Enter the starting date (DD/MM/YY) :
14/09/15
Enter the End date (DD/MM/YY) :
17/09/15
2
3 -
Enter the starting date (DD/MM/YY) :
31/08/15
Enter the End date (DD/MM/YY) :
30/09/15
21
如上面第一个示例所示,结果是正确的。
但是对于第二个例子结果不正确,预期结果是4.
即使是第三个例子,结果也不正确。
即使我输入任何工作日和星期六之间的日期也会得到不正确的结果。
请建议,应该对代码进行哪些更改。
谢谢。
你创建
SimpleDateFormat
有误,改成yy
而不是yyyy
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
这应该可以解决您的问题。我看不出你的逻辑有任何问题。
编辑
根据您的评论,如果您的开始日期大于结束日期,那么您必须在
while
循环之前交换它
if(start.after(end)) {
Calendar tempCal;
tempCal = start;
start = end;
end = tempCal;
}
检查以下代码:
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;
public class DaysCounter {
private String startDate;
private String endDate;
public void calculateDate(){
@SuppressWarnings("resource")
Scanner in=new Scanner(new InputStreamReader(System.in));
System.out.println("Enter the starting date (DD/MM/YY) :");
startDate=in.next();
System.out.println("Enter the End date (DD/MM/YY) :");
endDate=in.next();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
try
{
Calendar start = Calendar.getInstance();
start.setTime(sdf.parse(startDate));
Calendar end = Calendar.getInstance();
end.setTime(sdf.parse(endDate));
int workingDays = 0;
while(!start.after(end))
{
int day = start.get(Calendar.DAY_OF_WEEK);
day = day + 2;
if (day > 7){
day = day -7;
}
if ((day != Calendar.SATURDAY) && (day != Calendar.SUNDAY))
workingDays++;
start.add(Calendar.DATE, 1);
}
System.out.println(workingDays);
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
DaysCounter daysCounter=new DaysCounter();
daysCounter.calculateDate();
}
}
/*this program is for count the days between two days with excluding SATURDAY and SUNDAY*/
package example;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;
public class ValidDate {
private static Pattern datePattern = Pattern.compile("^\\d{1,2}/\\d{1,2}/\\d{4}$");
public static boolean isValidFormat(String src, String src1) {
if (datePattern.matcher(src).matches() && datePattern.matcher(src1).matches()) {
return true;
}
return false;
}
public static boolean isValidDate(String str, String str1) {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
sdf.setLenient(false);
try {
sdf.parse(str);
sdf.parse(str1);
return true;
} catch (ParseException e) {
return false;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter start Date");
String startDate = sc.next();
System.out.println("Enter end date");
String endDate = sc.next();
int workingDays = 0;
boolean isValidPattern = isValidFormat(startDate, endDate);
if (isValidPattern) {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
sdf.setLenient(false);
if (isValidDate(startDate, endDate)) {
//System.out.println("This is valid dates");
try {
Calendar start = Calendar.getInstance();
start.setTime(sdf.parse(startDate));
Calendar end = Calendar.getInstance();
end.setTime(sdf.parse(endDate));
while (!start.after(end)) {
int day = start.get(Calendar.DAY_OF_WEEK);
if ((day != Calendar.SATURDAY) && (day != Calendar.SUNDAY)) {
workingDays++;
}
start.add(Calendar.DATE, 1);
}
System.out.println("Working Days=" + workingDays);
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("Given date is invalid");
}
} else {
System.out.println("Please enter date in [DD/MM/YYYY] format");
}
}
}