count day by day, this is not a good methodclass DateTest { public static void main(String[] args) { String s1="2005-02-01 15:25:15"; String s2="2005-02-18 15:39:15";
DateTest dt = new DateTest();
int days[] = dt.countDays(s1, s2); for (int i=0; i<days.length; i++) { System.out.println("days[" + i + "] = " + days[i]); } }
public int[] countDays(Calendar c1, Calendar c2) { int[] days = new int[2]; days[0] = 0; days[1] = 0; while (c2.after(c1)) { days[0]++; if (c1.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && c1.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) { days[1]++; } c1.add(Calendar.DATE, 1); }
return days; }
public int[] countDays(Date d1, Date d2) { Calendar c1 = new GregorianCalendar(); Calendar c2 = new GregorianCalendar(); c1.setTime(d1); c2.setTime(d2); return countDays(c1, c2); }
public int[] countDays(String s1, String s2) { try { SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss"); Date d1 = s.parse(s1); Date d2 = s.parse(s2); return countDays(d1, d2); } catch (Exception e) { return null; } } }
简单。这里有一个判断日期的一段代码,你插上,每一天都判断一下是不是礼拜六或礼拜天(礼拜天返回值是0)public int getWeek(){ int Days[] = {31,59,90,120,151,181,212,243,273,304,334,365}; long n = (_year-1L)*365 + _day + (_year-1L)/4 - (_year-1L)/100 + (_year-1L)/400; if(_month>1) n+=Days[_month-2]; if((_month>2)&&(_year%4==0&&_year%100!=0||_year%400==0)) n++; return n%7; }如果判断是就跳过,不是就自动加1。
还有一个比较简单的判断星期的方法:public int dayofweek( int year, int month, int day ) { int a = (14-month) / 12; int y = year - a; int m = month + 12*a - 2; return (day + y + y/4 - y/100 + y/400 + (31*m)/12) % 7; }
int n1 =日期之间的差额; int n2 =-n1/7*2; int n3 = n1%7; int n4 =开始日期的星期数; if (n4+n3)>6 n3 = -2; else if (n4+n3)<6 n3 = 0; else n3 = -1;int 去除后的结果=n1+n2+n3;-------------------------------------------------- 注:具体的边界问题自己注意一下。
public static int getDateNum(Date from, Date to) { long time; if (from.getTime() > to.getTime()) { time = from.getTime() - to.getTime(); } else { time = to.getTime() - from.getTime(); }
// 2个时间段之间的天数 int dateNum = (int) (time / 1000 / 60 / 60 / 24); int weekNum = dateNum / 7; int resNum = dateNum % 7; Calendar calendar = Calendar.getInstance(); calendar.setTime(from); int num = 0; for (int i = 0; i < resNum; i++) { if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { num++; } if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { num++; } calendar.add(Calendar.DATE, 1); } dateNum = dateNum - dateNum / 7 * 2 - num; return dateNum; }
public static void main(String[] args) { SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss"); String ooo = "2005-02-18 15:39:15"; String ppp = "2005-02-01 15:25:15"; try { Date from = s.parse(ooo); Date to = s.parse(ppp); System.out.println(getDateNum(from, to)); } catch (Exception e) { System.out.println(e); } }
public static void main(String[] args){
SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss");
String ooo="2005-02-18 15:39:15";
String ppp="2005-02-01 15:25:15";
try{
Date tt=s.parse(ooo);
Date yy=s.parse(ppp);
long aa;
if(tt.getTime()>yy.getTime())
aa=tt.getTime()-yy.getTime();
else
aa=yy.getTime()-tt.getTime();
long date=aa/1000/60/60/24;
System.out.println("***");
System.out.println("hahahha"+date);
System.out.println("*******");
}catch(Exception e){
}
}
}
不除去星期天
-_-这个是死方法,很烂简单一点,可以先计算开始日期所在周的最后一天,和结束日期所在周的最后一天之间的天数,然后当中的周六周日数就好算了(天数/7 ×2),剩下就是调整一下实际开始日期和实际结束日期对天数的影响就ok了
date=(aa/1000/60/60/24/7)*5+((aa/1000/60/60/24)%7)
应该差不多是这样吧
public static void main(String[] args) {
String s1="2005-02-01 15:25:15";
String s2="2005-02-18 15:39:15";
DateTest dt = new DateTest();
int days[] = dt.countDays(s1, s2);
for (int i=0; i<days.length; i++) {
System.out.println("days[" + i + "] = " + days[i]);
}
}
public int[] countDays(Calendar c1, Calendar c2) {
int[] days = new int[2];
days[0] = 0;
days[1] = 0;
while (c2.after(c1)) {
days[0]++;
if (c1.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY &&
c1.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {
days[1]++;
}
c1.add(Calendar.DATE, 1);
}
return days;
}
public int[] countDays(Date d1, Date d2) {
Calendar c1 = new GregorianCalendar();
Calendar c2 = new GregorianCalendar();
c1.setTime(d1);
c2.setTime(d2);
return countDays(c1, c2);
}
public int[] countDays(String s1, String s2) {
try {
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss");
Date d1 = s.parse(s1);
Date d2 = s.parse(s2);
return countDays(d1, d2);
} catch (Exception e) {
return null;
}
}
}
int Days[] = {31,59,90,120,151,181,212,243,273,304,334,365};
long n = (_year-1L)*365 + _day + (_year-1L)/4 - (_year-1L)/100 + (_year-1L)/400;
if(_month>1)
n+=Days[_month-2];
if((_month>2)&&(_year%4==0&&_year%100!=0||_year%400==0))
n++;
return n%7;
}如果判断是就跳过,不是就自动加1。
{
int a = (14-month) / 12;
int y = year - a;
int m = month + 12*a - 2;
return (day + y + y/4 - y/100 + y/400 + (31*m)/12) % 7;
}
的死方法很好理解
呵呵 执行效率也还好 !!!
看不明白:(
int n2 =-n1/7*2;
int n3 = n1%7;
int n4 =开始日期的星期数;
if (n4+n3)>6
n3 = -2;
else if (n4+n3)<6
n3 = 0;
else
n3 = -1;int 去除后的结果=n1+n2+n3;--------------------------------------------------
注:具体的边界问题自己注意一下。
这几天可以在时间开头,也可以在时间段尾部
可以将这几天分离开来,用办法判断是否是礼拜5,礼拜6dateNum2 : 上面dateNum%7 中礼拜5,礼拜6的天数所以天数是dateNum - dateNum/7 * 2 - dateNum2
{
long time;
if (from.getTime() > to.getTime())
{
time = from.getTime() - to.getTime();
}
else
{
time = to.getTime() - from.getTime();
}
// 2个时间段之间的天数
int dateNum = (int) (time / 1000 / 60 / 60 / 24); int weekNum = dateNum / 7; int resNum = dateNum % 7; Calendar calendar = Calendar.getInstance(); calendar.setTime(from); int num = 0;
for (int i = 0; i < resNum; i++)
{
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
{
num++;
}
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY)
{
num++;
}
calendar.add(Calendar.DATE, 1);
} dateNum = dateNum - dateNum / 7 * 2 - num; return dateNum;
}
{
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss"); String ooo = "2005-02-18 15:39:15";
String ppp = "2005-02-01 15:25:15";
try
{
Date from = s.parse(ooo);
Date to = s.parse(ppp);
System.out.println(getDateNum(from, to));
}
catch (Exception e)
{
System.out.println(e);
} }
在大多数国家里,Julian Calendar被Gregorian Calendar(公历)替换发生在1582年10月15日,因为Julian Calendar和公历的leap year差别(公历多一个400年一闰),这样为了平稳的从Julian Calendar过渡到公历,从1582年10月4日直接跟着就是1582年10月15日, 中间的日期就没了!
如果你用的Locale碰巧在某些对公历接受比较晚的国家,比如在比利时,1584年才使用公历,这段消失的日期又会不一样。当然,如果你的程序不会操作这么变态的日期,你就不用关心太多Locale的问题,GregorianCalendar这个类这么复杂是有道理的