

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 @Override
216 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 @Override
269 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 @Override
305 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 @Override
349 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頁面展示部分

日歷形式展示部分,在日歷中一個周次不足6周會用空白格填充,來保證布局完整不錯位。
