你的位置:首页 > Java教程

[Java教程]Java 周历日历


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

 1 import java.util.Calendar; 2 import java.util.Date; 3 import java.util.Map; 4  5 import org.apache.commons.lang3.builder.ReflectionToStringBuilder; 6 import org.apache.commons.lang3.builder.ToStringStyle; 7 import org.apache.commons.lang3.time.DateFormatUtils; 8 import org.apache.commons.lang3.time.DateUtils; 9  10 import com.google.common.collect.Maps; 11  12 /** 13  * <b>function:</b> 周历 14  *  15  * @author hoojo 16  * @createDate 2016-11-21 上午11:02:08 17  * @file WeekCalendarUtils.java 18  * @package  19  * @project  20  * @blog http://blog.csdn.net/IBM_hoojo 21  * @email hoojo_@126.com 22  * @version 1.0 23 */ 24 public abstract class WeekCalendarUtils { 25  26   public final static String DATE_FORMAT = "yyyy-MM-dd";  27    28   private static String getWeekDay(Calendar cal) { 29     if (cal == null) { 30       return null; 31     } 32      33     switch (cal.get(Calendar.DAY_OF_WEEK)) { 34      35       case Calendar.MONDAY: 36         return "星期一"; 37       case Calendar.TUESDAY: 38         return "星期二"; 39       case Calendar.WEDNESDAY: 40         return "星期三"; 41       case Calendar.THURSDAY: 42         return "星期四"; 43       case Calendar.FRIDAY: 44         return "星期五"; 45       case Calendar.SATURDAY: 46         return "星期六"; 47       default: 48         return "星期日"; 49     } 50   } 51    52   private static String getSimpleWeekDay(Calendar cal) { 53     if (cal == null) { 54       return null; 55     } 56      57     switch (cal.get(Calendar.DAY_OF_WEEK)) { 58      59       case Calendar.MONDAY: 60         return "一"; 61       case Calendar.TUESDAY: 62         return "二"; 63       case Calendar.WEDNESDAY: 64         return "三"; 65       case Calendar.THURSDAY: 66         return "四"; 67       case Calendar.FRIDAY: 68         return "五"; 69       case Calendar.SATURDAY: 70         return "六"; 71       default: 72         return "日"; 73     } 74   } 75    76   public static String[] getWeekDays(boolean hasMonFirstWeekDay) { 77     if (hasMonFirstWeekDay) { 78       return new String[] { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" }; 79     } else { 80       return new String[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; 81     } 82   } 83  84   /** 85    * <b>function:</b> 获取周历 86    * @author hoojo 87    * @createDate 2016-11-21 下午6:00:18 88    * @param begin 开始日期 89    * @param end 结束日期 90    * @return 周历Map 91   */ 92   public static Map<Integer, YearModel> get(String begin, String end, boolean hasMonFirstWeekDay) { 93      94     Map<Integer, YearModel> years = Maps.newLinkedHashMap(); 95      96     Date beginDate = null; 97     Date endDate = null; 98      99     try {100       beginDate = DateUtils.parseDate(begin, DATE_FORMAT);101       endDate = DateUtils.parseDate(end, DATE_FORMAT);102       103       if (beginDate.compareTo(endDate) > 0) {104         return null;105       }106       107       int weekCount = 0, monthWeekCount = 0;108       do {109         Calendar cal = DateUtils.toCalendar(beginDate);110         if (hasMonFirstWeekDay) {111           cal.setFirstDayOfWeek(Calendar.MONDAY);112         }113         114         Map<Integer, MonthModel> months = Maps.newLinkedHashMap();115         int year = cal.get(Calendar.YEAR);116         YearModel yearModel = null;117         if (years.containsKey(year)) {118           yearModel = years.get(year);119           months = yearModel.getMonths();120         } else {121           yearModel = new YearModel(year, year + "年", months);122           years.put(year, yearModel);123           124           weekCount = 0;125         }126         127         Map<String, WeekModel> weeks = Maps.newLinkedHashMap();128         int month = cal.get(Calendar.MONTH) + 1;129         MonthModel monthModel = null;130         if (months.containsKey(month)) {131           monthModel = months.get(month);132           weeks = monthModel.getWeeks();133         } else {134           monthModel = new MonthModel(month, year + "年" + month + "月", weeks);135           months.put(month, monthModel);136           137           monthWeekCount = 0;138         }139         140         Map<String, DayModel> days = Maps.newLinkedHashMap();141         int weekInMonth = cal.get(Calendar.WEEK_OF_MONTH);142         String week = cal.getWeekYear() + "_" + month + "_" + weekInMonth;143         if (weeks.containsKey(week)) {144           days = weeks.get(week).getDays();145         } else {146           weeks.put(week, new WeekModel(weekInMonth, month + "月第" + weekInMonth + "周", days));147           148           monthWeekCount++;149           weekCount++;150           monthModel.setWeekCount(monthWeekCount);151           yearModel.setWeekCount(weekCount);152         }153         154         String weekDay = getWeekDay(cal);155         days.put(week + "_" + weekDay, new DayModel(cal.get(Calendar.DAY_OF_MONTH), weekDay, getSimpleWeekDay(cal), beginDate));156         /*157         System.out.println("日期:" + DateFormatUtils.format(beginDate, DATE_FORMAT));158         System.out.println("年份:" + cal.getWeekYear());159         System.out.println("月份:" + (cal.get(Calendar.MONTH) + 1));160         System.out.println("星期:" + cal.get(Calendar.DAY_OF_WEEK));161         System.out.println("本月周次:" + cal.get(Calendar.WEEK_OF_MONTH));162         System.out.println();163         */164         beginDate = DateUtils.addDays(beginDate, 1);165       } while (beginDate.compareTo(endDate) <= 0);166       167     } catch (Exception e) {168       e.printStackTrace();169     }170     return years;171   }172   173   public static Map<Integer, YearModel> get(Date beginDate, Date endDate, boolean hasMonFirstWeekDay) {174     175     try {176       return get(DateFormatUtils.format(beginDate, DATE_FORMAT), DateFormatUtils.format(endDate, DATE_FORMAT), hasMonFirstWeekDay);177     } catch (Exception e) {178       e.printStackTrace();179     }180     return null;181   }182 183   public static class YearModel {184     private int yearName;185     private String displayName;186     private int weekCount;187     private Map<Integer, MonthModel> months;188     189     public YearModel(int yearName, String displayName, Map<Integer, MonthModel> months) {190       super();191       this.yearName = yearName;192       this.displayName = displayName;193       this.months = months;194     }195     196     public int getYearName() {197       return yearName;198     }199     public void setYearName(int yearName) {200       this.yearName = yearName;201     }202     public String getDisplayName() {203       return displayName;204     }205     public void setDisplayName(String displayName) {206       this.displayName = displayName;207     }208     public Map<Integer, MonthModel> getMonths() {209       return months;210     }211     public void setMonths(Map<Integer, MonthModel> months) {212       this.months = months;213     }214     215     @Override216     public String toString() {217       return ReflectionToStringBuilder.toString(this, ToStringStyle.SIMPLE_STYLE);218     }219 220     public int getWeekCount() {221       return weekCount;222     }223 224     public void setWeekCount(int weekCount) {225       this.weekCount = weekCount;226     }227   }228   229   public static class MonthModel {230     231     private int monthName;232     private String displayName;233     private int weekCount;234     private Map<String, WeekModel> weeks;235     236     public MonthModel(int monthName, String displayName, Map<String, WeekModel> weeks) {237       super();238       this.monthName = monthName;239       this.displayName = displayName;240       this.weeks = weeks;241     }242     243     public int getMonthName() {244       return monthName;245     }246     public void setMonthName(int monthName) {247       this.monthName = monthName;248     }249     public String getDisplayName() {250       return displayName;251     }252     public void setDisplayName(String displayName) {253       this.displayName = displayName;254     }255     public Map<String, WeekModel> getWeeks() {256       return weeks;257     }258     public void setWeeks(Map<String, WeekModel> weeks) {259       this.weeks = weeks;260     }261     public int getWeekCount() {262       return weekCount;263     }264     265     public void setWeekCount(int weekCount) {266       this.weekCount = weekCount;267     }268     @Override269     public String toString() {270       return ReflectionToStringBuilder.toString(this, ToStringStyle.SIMPLE_STYLE);271     }272   }273   274   public static class WeekModel {275     276     private int weekName;277     private String displayName;278     private Map<String, DayModel> days;279     280     public WeekModel(int weekName, String displayName, Map<String, DayModel> days) {281       super();282       this.weekName = weekName;283       this.displayName = displayName;284       this.days = days;285     }286     public int getWeekName() {287       return weekName;288     }289     public void setWeekName(int weekName) {290       this.weekName = weekName;291     }292     public String getDisplayName() {293       return displayName;294     }295     public void setDisplayName(String displayName) {296       this.displayName = displayName;297     }298     public Map<String, DayModel> getDays() {299       return days;300     }301     public void setDays(Map<String, DayModel> days) {302       this.days = days;303     }304     @Override305     public String toString() {306       return ReflectionToStringBuilder.toString(this, ToStringStyle.SIMPLE_STYLE);307     }308   }309   310   public static class DayModel {311     312     private int dayName;313     private String displayName;314     private String simpleName;315     private Date date;316     317     public DayModel(int dayName, String displayName, String simpleName, Date date) {318       super();319       this.dayName = dayName;320       this.displayName = displayName;321       this.simpleName = simpleName;322       this.date = date;323     }324     public int getDayName() {325       return dayName;326     }327     public void setDayName(int dayName) {328       this.dayName = dayName;329     }330     public String getDisplayName() {331       return displayName;332     }333     public void setDisplayName(String displayName) {334       this.displayName = displayName;335     }336     public Date getDate() {337       return date;338     }339     public void setDate(Date date) {340       this.date = date;341     }342     public String getSimpleName() {343       return simpleName;344     }345     public void setSimpleName(String simpleName) {346       this.simpleName = simpleName;347     }348     @Override349     public String toString() {350       return ReflectionToStringBuilder.toString(this, ToStringStyle.SIMPLE_STYLE);351     }352   }353   354   public static void main(String[] args) {355     System.out.println(get("2016-06-01", "2017-07-03", false));356   }357 }

一个table页面展示部分

 1 <style type="text/css"> 2   td { 3     border: 1px solid black; 4     background-color: #eeeeee; 5     padding: 5px; 6     text-align: center; 7   } 8    9   table {10     border-collapse: collapse;11     border-spacing: 5px;12     border: 1px solid black;13   }14   15   th {16     border: 1px solid black;17     background: #9DACBF;18     color: #FFF;19     height: 20px;20     line-height: 20px21   }22   23   body {24     font-family: "宋体", "Arial", "Helvetica";25     font-size: 12px;26     font-style: normal;27     font-weight: lighter;28   }29   30   .head {31     background-color: #ccc;32     font-weight: bold;33   }34   35   .head b {36     color: #337ab7;37   }38   39   .odd td {40     background-color: white;41   }42   43   .even td {44     background-color: lavender;45   }46 </style>47 48 <table class="xuenianTable" width="100%" cellspacing="0" cellpadding="0" border="0">49   <thead>50     <tr height="55">51       <th colspan="10" style="font-size: 28px;"> (${param.fileName })教学周历</th>52     </tr>53     <tr height="35">54       <th width="10%">年份</th>55       <th width="10%">月份</th>56       <th width="10%">周次</th>57       <th width="10%">一</th>58       <th width="10%">二</th>59       <th width="10%">三</th>60       <th width="10%">四</th>61       <th width="10%">五</th>62       <th width="10%" style="color: #f34747;">六</th>63       <th width="10%" style="color: #f34747;">七</th>64     </tr>65   </thead>66   67   <tbody>68     69     <c:set var="weekCount" value="1"/>70     <c:forEach items="${result }" varStatus="st" var="year">71       <c:set var="yearFirst" value="true"/>72       <c:forEach items="${year.value.months }" var="month">73         <c:set var="monthFirst" value="true"/>74         <c:forEach items="${month.value.weeks }" var="week">75           <tr class="zhuanjafora ${st.index % 2 == 0 ? 'odd' : 'even' }">76             <c:if test="${yearFirst }">77               <c:set var="yearFirst" value="false"/>78               <td rowspan="${year.value.weekCount }" title="${year.value.displayName }">${year.value.displayName }</td>79             </c:if>80             <c:if test="${!monthFirst}">81               <c:set var="weekCount" value="${weekCount + 1 }"/>82             </c:if>83             <c:if test="${monthFirst }">84               <c:set var="monthFirst" value="false"/>85               <td rowspan="${month.value.weekCount }" title="${month.value.displayName }">${month.value.monthName }月</td>86             </c:if>87             <td title="${week.value.displayName }">${weekCount }周</td>88             <c:forEach items="${weekDays }" var="weekDay">89               <c:set var="weekDayKey" value="${week.key}_${weekDay }"/>90               <td title='${week.value.days[weekDayKey].displayName } <fmt:formatDate value="${week.value.days[weekDayKey].date }" pattern="yyyy-MM-dd"/>' >91                 ${week.value.days[weekDayKey].dayName }92               </td>93             </c:forEach>94           </tr>95         </c:forEach>96       </c:forEach>97     </c:forEach>98   </tbody>99 </table>

View Code

 

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

 1 <div style="width: 100%; height: 490px; overflow: scroll;"> 2        3   <c:set var="weekCount" value="1"/> 4   <c:forEach items="${result }" var="year"> 5     <c:set var="yearFirst" value="true"/> 6     <c:forEach items="${year.value.months }" var="month" varStatus="st"> 7       <c:set var="monthFirst" value="true"/> 8       <div style="width: 400px; height: 230px; float: left; margin-bottom: 5px;"> 9         <table border="0" cellspacing="0" cellpadding="0" width="100%" class="zhouli">10           <thead>11             <tr height="35">12               <th width="10%">年份</th>13               <th width="10%">月份</th>14               <th width="10%">周次</th>15               <th width="10%">一</th>16               <th width="10%">二</th>17               <th width="10%">三</th>18               <th width="10%">四</th>19               <th width="10%">五</th>20               <th width="10%" style="color: #f34747;">六</th>21               <th width="10%" style="color: #f34747;">七</th>22             </tr>23           </thead>24           25           <tbody>26             <c:set var="fillWeekCount" value="${6 - fn:length(month.value.weeks) }"/>27             <c:forEach items="${month.value.weeks }" var="week">28               <tr class="zhuanjafora ${st.index % 2 == 0 ? 'odd' : 'even' }">29                 <c:if test="${!monthFirst}">30                   <c:set var="weekCount" value="${weekCount + 1 }"/>31                 </c:if>32                 <c:if test="${monthFirst }">33                   <c:set var="monthFirst" value="false"/>34                   <td rowspan="${month.value.weekCount + fillWeekCount }" title="${year.value.displayName }">${year.value.yearName }</td>35                   <td rowspan="${month.value.weekCount + fillWeekCount }" title="${month.value.displayName }">${month.value.monthName }月</td>36                 </c:if>37                 <td title="${week.value.displayName }">${weekCount }周</td>38                 <c:forEach items="${weekDays }" var="weekDay">39                   <c:set var="weekDayKey" value="${week.key}_${weekDay }"/>40                   <td title='${week.value.days[weekDayKey].displayName } <fmt:formatDate value="${week.value.days[weekDayKey].date }" pattern="yyyy-MM-dd"/>' >41                     ${week.value.days[weekDayKey].dayName }42                   </td>43                 </c:forEach>44               </tr>45             </c:forEach>46             47             <c:forEach begin="1" end="${fillWeekCount }" var="i">48               <tr class="zhuanjafora ${st.index % 2 == 0 ? 'odd' : 'even' }">49                 <td>&nbsp;</td>50                 <td>&nbsp;</td>51                 <td>&nbsp;</td>52                 <td>&nbsp;</td>53                 <td>&nbsp;</td>54                 <td>&nbsp;</td>55                 <td>&nbsp;</td>56                 <td>&nbsp;</td>57               </tr>58             </c:forEach>59           </tbody>60         </table>61       </div>62     </c:forEach>63   </c:forEach>64   65 </div>

View Code