目标:扩充周的概念为周六到周五、周四到周三。也即认为一周的开始是周六而不是java默认的周末
输入:start_date,end_date
输出:XX年XX周
首先,周切分
以周六到周五为例,先拿到start_date所在的年份的第一个周六FirstSaturday作为第一周,将start_date向后拨到第一个周六,然后计算start_date与FirstSaturday之间相差了多少天,在整除7即可知道start_date所在的周六是本年的第几周。
end_date的处理与start_date类似,需要注意跨年的情况,将end_date向前拨到第一个周五。
对于FirstSaturday的计算时,注意,不仅要调整年、月、日,还要调整时、分、秒。如果不调整时、分、秒,那么计算出来的FirstSaturday的时分秒将会是当前的时分秒,在计算start_date与FirstSaturday之间相差多少天时,由于采用的是时间戳相减,而时间上不到24小时就会认为不是一天,就会带来误差。具体例子可以看:http://www.cnblogs.com/0201zcr/p/5000977.html
所以FirstSaturday的计算如下:
FirstSaturday = Calendar.getInstance();
FirstSaturday.set(startCal.get(Calendar.YEAR), Calendar.JANUARY, 1, 0, 0, 0);//重要!!!
while (FirstSaturday.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
FirstSaturday.add(Calendar.DAY_OF_YEAR, 1);
}
注意跨年的情况。当跨年时,我们需要重新计算FirstSaturday。这里只需要将年份重新变更,比如2015跨2016时,之前FirstSaturday是2015年的第一个周六,那么跨年时,将FirstSaturday改成2016年的第一个周六即可。
具体代码如下:
//计算开始日期是第几周
long beginWeekNum = (startCal.getTimeInMillis() / 1000 - FistSaturday.getTimeInMillis() / 1000) / SevenDay + 1;
String beginWeek = String.valueOf(beginWeekNum);
if (beginWeekNum < 10) {
beginWeek = "0" + beginWeekNum;
}
//计算结束日期是第几周
FistSaturday = Calendar.getInstance();
FistSaturday.set(endCal.get(Calendar.YEAR), Calendar.JANUARY, 1, 0, 0, 0);
while (FistSaturday.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
FistSaturday.add(Calendar.DAY_OF_YEAR, 1);
}
long endWeekNum = (endCal.getTimeInMillis() / 1000 - FistSaturday.getTimeInMillis() / 1000) / SevenDay + 1;
String endWeek = String.valueOf(endWeekNum);
if (endWeekNum < 10) {
endWeek = "0" + endWeekNum;
}
对于需要计算某段时间内具体每周的周号、每周的开始时间和结束时间的代码,如下:
import java.text.SimpleDateFormat;
import java.util.*;
/**
*
* @author zhaoruixing
*/
public class WeekHelper {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
private static long SevenDay = 604800;
/**
* @param startDate
* @param endDate
* @param args the command line arguments
* @return
*/
public static List<Week> getWeekSplit(Date startDate, Date endDate) {
ArrayList<Week> WeekList = new ArrayList<>();
Calendar startCal = Calendar.getInstance();
startCal.setTime(startDate);
Calendar endCal = Calendar.getInstance();
endCal.setTime(endDate);
Calendar FistSaturday = Calendar.getInstance();
FistSaturday.set(startCal.get(Calendar.YEAR), Calendar.JANUARY, 1, 0, 0, 0);
while (FistSaturday.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
FistSaturday.add(Calendar.DAY_OF_YEAR, 1);
}
while (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
startCal.add(Calendar.DAY_OF_YEAR, 1);
}
while (endCal.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY) {
endCal.add(Calendar.DAY_OF_YEAR, -1);
}
System.out.println(sdf.format(startCal.getTime()) + "\t" + sdf.format(endCal.getTime()));
int startYear = startCal.get(Calendar.YEAR);
while (startCal.compareTo(endCal) < 0) {
int endYear = startCal.get(Calendar.YEAR);
if (startYear < endYear) {
FistSaturday.set(endYear, Calendar.JANUARY, 1, 0, 0, 0);
while (FistSaturday.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
FistSaturday.add(Calendar.DAY_OF_YEAR, 1);
}
startYear = endYear;
}
Week everyWeek = new Week();
long WeekNum = (startCal.getTimeInMillis() / 1000 - FistSaturday.getTimeInMillis() / 1000) / SevenDay + 1;
String WeekNumStr = String.valueOf(WeekNum);
if (WeekNum < 10) {
WeekNumStr = "0" + WeekNum;
}
everyWeek.setYear(startCal.get(Calendar.YEAR));
everyWeek.setWeekBegin(sdf.format(startCal.getTime()));
startCal.add(Calendar.DATE, 6);
everyWeek.setWeekEnd(sdf.format(startCal.getTime()));
everyWeek.setWeekNum(WeekNumStr);
startCal.add(Calendar.DATE, 1);
WeekList.add(everyWeek);
}
Iterator<Week> iter = WeekList.iterator();
System.out.println("开始打印");
while (iter.hasNext()) {
Week everyweek = iter.next();
System.out.println(everyweek.getYear() + "年第" + everyweek.getWeekNum() + "周\t" + "开始时间:" + everyweek.getWeekBegin() + "\t结束时间" + everyweek.getWeekEnd());
}
return WeekList;
}
public static void main(String[] args) {
String start = "2015-12-12";
String end = "2016-02-01";
try {
Date startDate = sdf.parse(start);
Date endDate = sdf.parse(end);
getWeekSplit(startDate, endDate);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Week {
String weekNum;
int year;
String weekBegin;
String weekEnd;
public String getWeekNum() {
return weekNum;
}
public void setWeekNum(String weekNum) {
this.weekNum = weekNum;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public String getWeekBegin() {
return weekBegin;
}
public void setWeekBegin(String weekBegin) {
this.weekBegin = weekBegin;
}
public String getWeekEnd() {
return weekEnd;
}
public void setWeekEnd(String weekEnd) {
this.weekEnd = weekEnd;
}
}
执行结果如下: