setFirstDayOfWeek的方法意思只对WEEK_OF_MONTH 与WEEK_OF_YEAR 有作用.
WEEK_OF_MONTH :当前Calendar日期对象是当前月的第几周.
WEEK_OF_YEAR :当前Calendar 日期对象是当前年的第几周.
程序是2009年1月31号为例子的.打印出当星期的第一天(FirstDayOfWeek)是星期天-星期六,年或月第一星期最少天数(MinimalDaysInFirstWeek)是1-7的所有组合的结果,也就是49个.
当setFirstDayOfWeek(1),星期第一天是星期天时.
1号前面的天数不算在第一周里面,如果是从星期天开始的,那么星期的最后一天是星期六.第一周只有3天.
第二周4号到10号.
第三周11号到17号.
第四周18号到24号.
第五周为25到31号.
如果设置setMinimalDaysInFirstWeek ()为1-3,那么2009年1月31号是这第月的第五周.
如果设置setMinimalDaysInFirstWeek ()为4-7,那么2009年1月31号是这第月的第四周,因为第一周不满4天,那就更加不满七天了.
相信大家都明白setFirstDayOfWeek方法的作用了吧.按照这样的算法,一个月可以算出6周来.比如一个月的1号为星期5,那么31号为星期日.setFirstDayOfWeek()为1,也就是一周从星期天开始,setMinimalDaysInFirstWeek 为1,也是就一天也算是1周.这样一个月六周就出来了.
public static void main(String[] args) {
Calendar cale = new GregorianCalendar(2020, 0, 4);
System.out.println(cale.getTime().toLocaleString());
cale.setFirstDayOfWeek(Calendar.SUNDAY);//1为星期天,7为星期六
cale.setMinimalDaysInFirstWeek(1);
System.out.println("bbb"+cale.get(Calendar.WEEK_OF_YEAR));
//如果是跨年的那个月份,前一年最后几天与后一年的首月的前几天在一周内算第二年的第一周
cale = new GregorianCalendar(2019, 11, 29);
System.out.println(cale.getTime().toLocaleString());
cale.setFirstDayOfWeek(Calendar.SUNDAY);//1为星期天,7为星期六
cale.setMinimalDaysInFirstWeek(1);
System.out.println("bbb"+cale.get(Calendar.WEEK_OF_YEAR));
//FirstDayOfWeek默认为周日 MinimalDaysInFirstWeek为1天
Calendar startCalendar = Calendar.getInstance();
System.out.println("aaa"+startCalendar.getFirstDayOfWeek()+" " + startCalendar.getMinimalDaysInFirstWeek());
// System.out.println("bbb"+cale.getActualMaximum(java.util.Calendar.WEEK_OF_YEAR));
}
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse("2020-04-12");
Date date2 = sdf.parse("2020-04-26");
int dayOffset = calcDayOffset(date1, date2);
System.out.println("dayOffset:" + dayOffset);
int weekOffset = calcWeekOffset(date1, date2);
System.out.println("weekOffset:" + weekOffset);
}
/**
* date2比date1多的天数
*
* @param date1
* @param date2
* @return
*/
public static int calcDayOffset(Date date1, Date date2) {
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date1);
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date2);
int day1 = cal1.get(Calendar.DAY_OF_YEAR);
int day2 = cal2.get(Calendar.DAY_OF_YEAR);
int year1 = cal1.get(Calendar.YEAR);
int year2 = cal2.get(Calendar.YEAR);
if (year1 != year2) { //同一年
int timeDistance = 0;
for (int i = year1; i < year2; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) { //闰年
timeDistance += 366;
} else { //不是闰年
timeDistance += 365;
}
}
return timeDistance + (day2 - day1);
} else { //不同年
return day2 - day1;
}
}
/**
* date2比date1多的周数
* @param startTime
* @param endTime
* @return
*/
public static int calcWeekOffset(Date startTime, Date endTime) {
Calendar cal = Calendar.getInstance();
cal.setTime(startTime);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
dayOfWeek = dayOfWeek - 1;
if (dayOfWeek == 0) dayOfWeek = 7;
int dayOffset = calcDayOffset(startTime, endTime)+1;
int weekOffset = dayOffset / 7;
int a;
if (dayOffset > 0) {
a = (dayOffset % 7 + dayOfWeek > 7) ? 1 : 0;
} else {
a = (dayOfWeek + dayOffset % 7 < 1) ? -1 : 0;
}
weekOffset = weekOffset + a;
return weekOffset;
}
网友评论