1 package com.ly.tool.date;
2
3 import java.text.DateFormat;
4 import java.text.ParseException;
5 import java.text.SimpleDateFormat;
6 import java.util.ArrayList;
7 import java.util.Calendar;
8 import java.util.Date;
9 import java.util.List;
10
11 /**
12 * YearlyDate
13 *
14 * @author Morningstar
15 * @version 1.0
16 * 2021/12/31 15:32
17 *
18 **/
19 public class YearlyDate {
20
21 /**
22 * 计算全年的日期
23 * @param year
24 * @return
25 *
26 */
27 public static ArrayList<String> GetDate(int year){
28 ArrayList<String> dateList = new ArrayList<>();
29 for(int mon = 1;mon<13;mon++){
30 int month=mon;
31 int day=0;
32 //第二步:求输入的年份月份与1900年1月1日相隔的总天数
33 for (int i = 1900; i < year; i++) {
34 if ((i % 4 == 0 && i % 100 != 0)||(i % 400 == 0)) {
35 day+=366;
36 }else {
37 day+=365;
38 }
39 }
40 //求相隔月份的天数
41 for (int i = 1; i < month; i++) {
42 if (i==2) {
43 if ((year%4==0&&year%100!=0)||(year%400==0)) {
44 day+=29;
45 }else {
46 day+=28;
47 }
48 }else if (i==4||i==6||i==9||i==11) {
49 day+=30;
50 }else {
51 day+=31;
52 }
53 }
54 //第三步:计算上个月最后一天是星期几
55 int weeks=day%7;
56 int day2=0;
57 switch (month) {
58 case 2:
59 if (year%4==0&&year%100!=0||year%400==0) {
60 day2+=29;
61 }else {
62 day2+=28;
63 }
64 break;
65 case 4:
66 case 6:
67 case 9:
68 case 11:
69 day2=30;
70 break;
71 default:
72 day2=31;
73 break;
74 }
75 //第四部:打印日历
76 for (int i = 1; i <= weeks; i++) {
77
78 }
79 for (int i = 1; i <= day2; i++) {
80
81 String sdate=year+"-"+mon+"-"+i;
82 dateList.add(sdate);
83 if ((i+weeks)%7==0) {
84
85 }
86 }
87
88 }
89
90 return dateList;
91
92
93 }
94
95 /**
96 * 计算某一天是周几
97 * @param pTime
98 * @return
99 * 格式为2018-01-01
100 * 如果错误就返回0
101 */
102 public static int dayForWeek(String pTime){
103
104 try {
105
106
107 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
108
109 Date tmpDate = format.parse(pTime);
110
111 Calendar cal = Calendar.getInstance();
112
113 // String[] weekDays = { "7", "1", "2", "3", "4", "5", "6" };
114 int [] weekDays = {7,1,2,3,4,5,6};
115
116 try {
117
118 cal.setTime(tmpDate);
119
120 } catch (Exception e) {
121
122 e.printStackTrace();
123
124 }
125
126 int w = cal.get(Calendar.DAY_OF_WEEK) - 1; // 指示一个星期中的某天。
127
128 if (w < 0) {
129 w = 0;
130 }
131
132 return weekDays[w];
133 }catch (Exception e){
134 e.printStackTrace();
135 return 0;
136 }
137
138 }
139
140 /**
141 * 把一年的周一到周日封装到一个list里面
142 * 顶层list里面有7个list,从周一到周日排列
143 * @param year
144 * @return
145 */
146 public static List<List<String>> getYearWeek(int year) {
147 //获取到某年的所有的日期
148 //1900年1月1日相隔的总天数
149 ArrayList<String> dateList = GetDate(year);
150 ArrayList<String> MondayList = new ArrayList<>();
151 ArrayList<String> TuesdayList = new ArrayList<>();
152 ArrayList<String> WednesdayList = new ArrayList<>();
153 ArrayList<String> ThursdayList = new ArrayList<>();
154 ArrayList<String> FridayList = new ArrayList<>();
155 ArrayList<String> SaturdayList = new ArrayList<>();
156 ArrayList<String> SundayList = new ArrayList<>();
157 //判断每天是周几
158 dateList.forEach(s -> {
159 try {
160 int i= dayForWeek(s);
161 // System.out.println(s+"周"+CalculationDate.dayForWeek(s));
162 if (i==1){
163 MondayList.add(s);
164 return;
165 }
166 if (i==2){
167 TuesdayList.add(s);
168 return;
169 }
170 if (i==3){
171 WednesdayList.add(s);
172 return;
173 }
174 if (i==4){
175 ThursdayList.add(s);
176 return;
177 }
178 if (i==5){
179 FridayList.add(s);
180 return;
181 }
182 if (i==6){
183 SaturdayList.add(s);
184 return;
185 }
186 if (i==7){
187 SundayList.add(s);
188 return;
189 }
190
191 } catch (Throwable throwable) {
192 throwable.printStackTrace();
193 }
194
195 });
196
197 ArrayList<List<String>> lists = new ArrayList<>();
198 lists.add(MondayList);
199 lists.add(TuesdayList);
200 lists.add(WednesdayList);
201 lists.add(ThursdayList);
202 lists.add(FridayList);
203 lists.add(SaturdayList);
204 lists.add(SundayList);
205 return lists;
206
207
208
209 }
210
211 /**
212 * 获取两个日期之间的所有日期
213 *
214 * @param startTime
215 * 开始日期 格式2018-01-01
216 * @param endTime
217 * 结束日期 格式2018-01-01
218 * @return
219 */
220 public static List<String> getDays(String startTime, String endTime) {
221
222 // 返回的日期集合
223 List<String> days = new ArrayList<String>();
224
225 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
226 try {
227 Date start = dateFormat.parse(startTime);
228 Date end = dateFormat.parse(endTime);
229
230 Calendar tempStart = Calendar.getInstance();
231 tempStart.setTime(start);
232
233 Calendar tempEnd = Calendar.getInstance();
234 tempEnd.setTime(end);
235 tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
236 while (tempStart.before(tempEnd)) {
237 days.add(dateFormat.format(tempStart.getTime()));
238 tempStart.add(Calendar.DAY_OF_YEAR, 1);
239 }
240
241 } catch (ParseException e) {
242 e.printStackTrace();
243 }
244
245 return days;
246 }
247
248
249
250
251
252 }