Java 周历日历

DbhVozhcEZvQGMfR6Pkc-A33RMAoVqH3kdctdDxLPiz0KMRW2CzXRBv6xocSrCIQCW3F0UN7WhASMren1qSsU15CaWlWmWIU4GDq8mwJheVsOWifb-2OKSia-mzf4jrK.png

DbhVozhcEZvQGMfR6Pkc-A33RMAoVqH3kdctdDxLPiz0KMRW2CzXRBv6xocSrCIQCW3F0UN7WhASMren1qSsU5XHzidzPkF3aEmFWqTAxr1XQkeCZVCNDa0-OiT75BVV.png

WeekCalendarUtils工具类代码,传入起始日期即可返回对应日期的周历日历,年月部分添加周数统计

import java.util.Calendar;
 import java.util.Date;
 import java.util.Map;
 
 import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import org.apache.commons.lang3.time.DateFormatUtils;
 import org.apache.commons.lang3.time.DateUtils;
 
 import com.google.common.collect.Maps;
 
 /**
  * <b>function:</b> 周历
  * 
  * @author hoojo
  * @createDate 2016-11-21 上午11:02:08
  * @file WeekCalendarUtils.java
  * @package 
  * @project 
  * @blog http://blog.csdn.net/IBM_hoojo
  * @email [email protected]
  * @version 1.0
  */
 public abstract class WeekCalendarUtils {
 
     public final static String DATE_FORMAT = "yyyy-MM-dd";  
     
     private static String getWeekDay(Calendar cal) {
         if (cal == null) {
             return null;
         }
         
         switch (cal.get(Calendar.DAY_OF_WEEK)) {
         
             case Calendar.MONDAY:
                 return "星期一";
             case Calendar.TUESDAY:
                 return "星期二";
             case Calendar.WEDNESDAY:
                 return "星期三";
             case Calendar.THURSDAY:
                 return "星期四";
             case Calendar.FRIDAY:
                 return "星期五";
             case Calendar.SATURDAY:
                 return "星期六";
             default:
                 return "星期日";
         }
     }
     
     private static String getSimpleWeekDay(Calendar cal) {
         if (cal == null) {
             return null;
         }
         
         switch (cal.get(Calendar.DAY_OF_WEEK)) {
         
             case Calendar.MONDAY:
                 return "一";
             case Calendar.TUESDAY:
                 return "二";
             case Calendar.WEDNESDAY:
                 return "三";
             case Calendar.THURSDAY:
                 return "四";
             case Calendar.FRIDAY:
                 return "五";
             case Calendar.SATURDAY:
                 return "六";
             default:
                 return "日";
         }
     }
     
     public static String[] getWeekDays(boolean hasMonFirstWeekDay) {
         if (hasMonFirstWeekDay) {
             return new String[] { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
         } else {
             return new String[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
         }
     }
 
     /**
      * <b>function:</b> 获取周历
      * @author hoojo
      * @createDate 2016-11-21 下午6:00:18
      * @param begin 开始日期
      * @param end 结束日期
      * @return 周历Map
      */
     public static Map<Integer, YearModel> get(String begin, String end, boolean hasMonFirstWeekDay) {
         
         Map<Integer, YearModel> years = Maps.newLinkedHashMap();
         
         Date beginDate = null;
         Date endDate = null;
         
         try {
             beginDate = DateUtils.parseDate(begin, DATE_FORMAT);
             endDate = DateUtils.parseDate(end, DATE_FORMAT);
             
             if (beginDate.compareTo(endDate) > 0) {
                 return null;
             }
             
             int weekCount = 0, monthWeekCount = 0;
             do {
                 Calendar cal = DateUtils.toCalendar(beginDate);
                 if (hasMonFirstWeekDay) {
                     cal.setFirstDayOfWeek(Calendar.MONDAY);
                 }
                 
                 Map<Integer, MonthModel> months = Maps.newLinkedHashMap();
                 int year = cal.get(Calendar.YEAR);
                 YearModel yearModel = null;
                 if (years.containsKey(year)) {
                     yearModel = years.get(year);
                     months = yearModel.getMonths();
                 } else {
                     yearModel = new YearModel(year, year + "年", months);
                     years.put(year, yearModel);
                     
                     weekCount = 0;
                 }
                 
                 Map<String, WeekModel> weeks = Maps.newLinkedHashMap();
                 int month = cal.get(Calendar.MONTH) + 1;
                 MonthModel monthModel = null;
                 if (months.containsKey(month)) {
                      monthModel = months.get(month);
                      weeks = monthModel.getWeeks();
                 } else {
                     monthModel = new MonthModel(month, year + "年" + month + "月", weeks);
                     months.put(month, monthModel);
                     
                     monthWeekCount = 0;
                 }
                 
                 Map<String, DayModel> days = Maps.newLinkedHashMap();
                 int weekInMonth = cal.get(Calendar.WEEK_OF_MONTH);
                 String week = cal.getWeekYear() + "_" + month + "_" + weekInMonth;
                 if (weeks.containsKey(week)) {
                     days = weeks.get(week).getDays();
                 } else {
                     weeks.put(week, new WeekModel(weekInMonth, month + "月第" + weekInMonth + "周", days));
                     
                     monthWeekCount++;
                     weekCount++;
                     monthModel.setWeekCount(monthWeekCount);
                     yearModel.setWeekCount(weekCount);
                 }
                 
                 String weekDay = getWeekDay(cal);
                 days.put(week + "_" + weekDay, new DayModel(cal.get(Calendar.DAY_OF_MONTH), weekDay, getSimpleWeekDay(cal), beginDate));
                 /*
                 System.out.println("日期:" + DateFormatUtils.format(beginDate, DATE_FORMAT));
                 System.out.println("年份:" + cal.getWeekYear());
                 System.out.println("月份:" + (cal.get(Calendar.MONTH) + 1));
                 System.out.println("星期:" + cal.get(Calendar.DAY_OF_WEEK));
                 System.out.println("本月周次:" + cal.get(Calendar.WEEK_OF_MONTH));
                 System.out.println();
                 */
                 beginDate = DateUtils.addDays(beginDate, 1);
             } while (beginDate.compareTo(endDate) <= 0);
             
         } catch (Exception e) {
             e.printStackTrace();
         }
         return years;
     }
     
     public static Map<Integer, YearModel> get(Date beginDate, Date endDate, boolean hasMonFirstWeekDay) {
         
         try {
             return get(DateFormatUtils.format(beginDate, DATE_FORMAT), DateFormatUtils.format(endDate, DATE_FORMAT), hasMonFirstWeekDay);
         } catch (Exception e) {
             e.printStackTrace();
         }
         return null;
     }
 
     public static class YearModel {
         private int yearName;
         private String displayName;
         private int weekCount;
         private Map<Integer, MonthModel> months;
         
         public YearModel(int yearName, String displayName, Map<Integer, MonthModel> months) {
             super();
             this.yearName = yearName;
             this.displayName = displayName;
             this.months = months;
         }
         
         public int getYearName() {
             return yearName;
         }
         public void setYearName(int yearName) {
             this.yearName = yearName;
         }
         public String getDisplayName() {
             return displayName;
         }
         public void setDisplayName(String displayName) {
             this.displayName = displayName;
         }
         public Map<Integer, MonthModel> getMonths() {
             return months;
         }
         public void setMonths(Map<Integer, MonthModel> months) {
             this.months = months;
         }
         
         @Override
         public String toString() {
             return ReflectionToStringBuilder.toString(this, ToStringStyle.SIMPLE_STYLE);
         }
 
         public int getWeekCount() {
             return weekCount;
         }
 
         public void setWeekCount(int weekCount) {
             this.weekCount = weekCount;
         }
     }
     
     public static class MonthModel {
         
         private int monthName;
         private String displayName;
         private int weekCount;
         private Map<String, WeekModel> weeks;
         
         public MonthModel(int monthName, String displayName, Map<String, WeekModel> weeks) {
             super();
             this.monthName = monthName;
             this.displayName = displayName;
             this.weeks = weeks;
         }
         
         public int getMonthName() {
             return monthName;
         }
         public void setMonthName(int monthName) {
             this.monthName = monthName;
         }
         public String getDisplayName() {
             return displayName;
         }
         public void setDisplayName(String displayName) {
             this.displayName = displayName;
         }
         public Map<String, WeekModel> getWeeks() {
             return weeks;
         }
         public void setWeeks(Map<String, WeekModel> weeks) {
             this.weeks = weeks;
         }
         public int getWeekCount() {
             return weekCount;
         }
         
         public void setWeekCount(int weekCount) {
             this.weekCount = weekCount;
         }
         @Override
         public String toString() {
             return ReflectionToStringBuilder.toString(this, ToStringStyle.SIMPLE_STYLE);
         }
     }
     
     public static class WeekModel {
         
         private int weekName;
         private String displayName;
         private Map<String, DayModel> days;
         
         public WeekModel(int weekName, String displayName, Map<String, DayModel> days) {
             super();
             this.weekName = weekName;
             this.displayName = displayName;
             this.days = days;
         }
         public int getWeekName() {
             return weekName;
         }
         public void setWeekName(int weekName) {
             this.weekName = weekName;
         }
         public String getDisplayName() {
             return displayName;
         }
         public void setDisplayName(String displayName) {
             this.displayName = displayName;
         }
         public Map<String, DayModel> getDays() {
             return days;
         }
         public void setDays(Map<String, DayModel> days) {
             this.days = days;
         }
         @Override
         public String toString() {
             return ReflectionToStringBuilder.toString(this, ToStringStyle.SIMPLE_STYLE);
         }
     }
     
     public static class DayModel {
         
         private int dayName;
         private String displayName;
         private String simpleName;
         private Date date;
         
         public DayModel(int dayName, String displayName, String simpleName, Date date) {
             super();
             this.dayName = dayName;
             this.displayName = displayName;
             this.simpleName = simpleName;
             this.date = date;
         }
         public int getDayName() {
             return dayName;
         }
         public void setDayName(int dayName) {
             this.dayName = dayName;
         }
         public String getDisplayName() {
             return displayName;
         }
         public void setDisplayName(String displayName) {
             this.displayName = displayName;
         }
         public Date getDate() {
             return date;
         }
         public void setDate(Date date) {
             this.date = date;
         }
         public String getSimpleName() {
             return simpleName;
         }
         public void setSimpleName(String simpleName) {
             this.simpleName = simpleName;
         }
         @Override
         public String toString() {
             return ReflectionToStringBuilder.toString(this, ToStringStyle.SIMPLE_STYLE);
         }
     }
     
     public static void main(String[] args) {
         System.out.println(get("2016-06-01", "2017-07-03", false));
     }
 }

一个table页面展示部分

p_fNEwJfKixA9iCGnAN4qSyaLTu_fXlYHhniP3fF0Xn5jc_r_IdEypbuMnj7PTfTJfRBj5H9TxjBbe_p7Vd8y9TLEkmN7jOS8KrelW_PWzo.gifp_fNEwJfKixA9iCGnAN4qSyaLTu_fXlYHhniP3fF0Xn45HP0qh8qr3QeuHh8e_XueXSW9RC8R6KAcgRGUQByNv1esdxXsFwKC6-jJAvn4mQ.gif

<style type="text/css">
     td {
         border: 1px solid black;
         background-color: #eeeeee;
         padding: 5px;
         text-align: center;
     }
     
     table {
         border-collapse: collapse;
         border-spacing: 5px;
         border: 1px solid black;
     }
     
     th {
         border: 1px solid black;
         background: #9DACBF;
         color: #FFF;
         height: 20px;
         line-height: 20px
     }
     
     body {
         font-family: "宋体", "Arial", "Helvetica";
         font-size: 12px;
         font-style: normal;
         font-weight: lighter;
     }
     
     .head {
         background-color: #ccc;
         font-weight: bold;
     }
     
     .head b {
         color: #337ab7;
     }
     
     .odd td {
         background-color: white;
     }
     
     .even td {
         background-color: lavender;
     }
 </style>
 
 <table class="xuenianTable" width="100%" cellspacing="0" cellpadding="0" border="0">
     <thead>
         <tr height="55">
             <th colspan="10" style="font-size: 28px;"> (${param.fileName })教学周历</th>
         </tr>
         <tr height="35">
             <th width="10%">年份</th>
             <th width="10%">月份</th>
             <th width="10%">周次</th>
             <th width="10%">一</th>
             <th width="10%">二</th>
             <th width="10%">三</th>
             <th width="10%">四</th>
             <th width="10%">五</th>
             <th width="10%" style="color: #f34747;">六</th>
             <th width="10%" style="color: #f34747;">七</th>
         </tr>
     </thead>
     
     <tbody>
         
         <c:set var="weekCount" value="1"/>
         <c:forEach items="${result }" varStatus="st" var="year">
             <c:set var="yearFirst" value="true"/>
             <c:forEach items="${year.value.months }" var="month">
                 <c:set var="monthFirst" value="true"/>
                 <c:forEach items="${month.value.weeks }" var="week">
                     <tr class="zhuanjafora ${st.index % 2 == 0 ? 'odd' : 'even' }">
                         <c:if test="${yearFirst }">
                             <c:set var="yearFirst" value="false"/>
                             <td rowspan="${year.value.weekCount }" title="${year.value.displayName }">${year.value.displayName }</td>
                         </c:if>
                         <c:if test="${!monthFirst}">
                             <c:set var="weekCount" value="${weekCount + 1 }"/>
                         </c:if>
                         <c:if test="${monthFirst }">
                             <c:set var="monthFirst" value="false"/>
                             <td rowspan="${month.value.weekCount }" title="${month.value.displayName }">${month.value.monthName }月</td>
                         </c:if>
                         <td title="${week.value.displayName }">${weekCount }周</td>
                         <c:forEach items="${weekDays }" var="weekDay">
                             <c:set var="weekDayKey" value="${week.key}_${weekDay }"/>
                             <td title='${week.value.days[weekDayKey].displayName }  <fmt:formatDate value="${week.value.days[weekDayKey].date }" pattern="yyyy-MM-dd"/>' style="color: ${weekDay == '星期六' or weekDay == '星期日' ? 'red' : ''};">
                                 ${week.value.days[weekDayKey].dayName }
                             </td>
                         </c:forEach>
                     </tr>
                 </c:forEach>
             </c:forEach>
         </c:forEach>
     </tbody>
 </table>
View Code

日历形式展示部分,在日历中一个周次不足6周会用空白格填充,来保证布局完整不错位。

p_fNEwJfKixA9iCGnAN4qSyaLTu_fXlYHhniP3fF0Xn5jc_r_IdEypbuMnj7PTfTJfRBj5H9TxjBbe_p7Vd8y9TLEkmN7jOS8KrelW_PWzo.gifp_fNEwJfKixA9iCGnAN4qSyaLTu_fXlYHhniP3fF0Xn45HP0qh8qr3QeuHh8e_XueXSW9RC8R6KAcgRGUQByNv1esdxXsFwKC6-jJAvn4mQ.gif

<div style="width: 100%; height: 490px; overflow: scroll;">
             
     <c:set var="weekCount" value="1"/>
     <c:forEach items="${result }" var="year">
         <c:set var="yearFirst" value="true"/>
         <c:forEach items="${year.value.months }" var="month" varStatus="st">
             <c:set var="monthFirst" value="true"/>
             <div style="width: 400px; height: 230px; float: left; margin-bottom: 5px;">
                 <table border="0" cellspacing="0" cellpadding="0" width="100%" class="zhouli">
                     <thead>
                         <tr height="35">
                             <th width="10%">年份</th>
                             <th width="10%">月份</th>
                             <th width="10%">周次</th>
                             <th width="10%">一</th>
                             <th width="10%">二</th>
                             <th width="10%">三</th>
                             <th width="10%">四</th>
                             <th width="10%">五</th>
                             <th width="10%" style="color: #f34747;">六</th>
                             <th width="10%" style="color: #f34747;">七</th>
                         </tr>
                     </thead>
                     
                     <tbody>
                         <c:set var="fillWeekCount" value="${6 - fn:length(month.value.weeks) }"/>
                         <c:forEach items="${month.value.weeks }" var="week">
                             <tr class="zhuanjafora ${st.index % 2 == 0 ? 'odd' : 'even' }">
                                 <c:if test="${!monthFirst}">
                                     <c:set var="weekCount" value="${weekCount + 1 }"/>
                                 </c:if>
                                 <c:if test="${monthFirst }">
                                     <c:set var="monthFirst" value="false"/>
                                     <td rowspan="${month.value.weekCount + fillWeekCount }" title="${year.value.displayName }">${year.value.yearName }</td>
                                     <td rowspan="${month.value.weekCount + fillWeekCount }" title="${month.value.displayName }">${month.value.monthName }月</td>
                                 </c:if>
                                 <td title="${week.value.displayName }">${weekCount }周</td>
                                 <c:forEach items="${weekDays }" var="weekDay">
                                     <c:set var="weekDayKey" value="${week.key}_${weekDay }"/>
                                     <td title='${week.value.days[weekDayKey].displayName }  <fmt:formatDate value="${week.value.days[weekDayKey].date }" pattern="yyyy-MM-dd"/>' style="color: ${weekDay == '星期六' or weekDay == '星期日' ? 'red' : ''};">
                                         ${week.value.days[weekDayKey].dayName }
                                     </td>
                                 </c:forEach>
                             </tr>
                         </c:forEach>
                         
                         <c:forEach begin="1" end="${fillWeekCount }" var="i">
                             <tr class="zhuanjafora ${st.index % 2 == 0 ? 'odd' : 'even' }">
                                 <td>&nbsp;</td>
                                 <td>&nbsp;</td>
                                 <td>&nbsp;</td>
                                 <td>&nbsp;</td>
                                 <td>&nbsp;</td>
                                 <td>&nbsp;</td>
                                 <td>&nbsp;</td>
                                 <td>&nbsp;</td>
                             </tr>
                         </c:forEach>
                     </tbody>
                 </table>
             </div>
         </c:forEach>
     </c:forEach>
     
 </div>
View Code