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> </td>50 <td> </td>51 <td> </td>52 <td> </td>53 <td> </td>54 <td> </td>55 <td> </td>56 <td> </td>57 </tr>58 </c:forEach>59 </tbody>60 </table>61 </div>62 </c:forEach>63 </c:forEach>64 65 </div>
View Code
原标题:Java 周历日历
关键词:JAVA