1 package com.cy;
59 import java.security.InvalidParameterException;
60 import java.text.ParseException;
61 import java.text.SimpleDateFormat;
62 import java.util.ArrayList;
63 import java.util.Calendar;
64 import java.util.Date;
65 import java.util.HashMap;
66 import java.util.Map;
67
68 public class DateUtils {
69 private static final long MILLIS_IN_A_SECOND = 1000;
70
71 private static final long SECONDS_IN_A_MINUTE = 60;
72
73 private static final int MONTHS_IN_A_YEAR = 12;
74
75 /**
76 * 获得指定日期之后一段时期的日期。例如某日期之后3天的日期等 时间为23:59:59。
77 *
78 * @param origDate
79 * 基准日期
80 * @param amount
81 * 时间数量
82 * @param timeUnit
83 * 时间单位,如年、月、日等。用Calendar中的常量代表
84 * @return {@link Date}
85 */
86 public static final Date dateAfter(Date origDate, int amount, int timeUnit) {
87 Calendar calendar = Calendar.getInstance();
88 calendar.setTime(origDate);
89 // 将小时至0
90 // calendar.set(Calendar.HOUR_OF_DAY, 23);
91 // 将分钟至0
92 // calendar.set(Calendar.MINUTE, 59);
93 // 将秒至0
94 // calendar.set(Calendar.SECOND, 59);
95 // 将毫秒至0
96 // calendar.set(Calendar.MILLISECOND, 0);
97 calendar.add(timeUnit, amount);
98 return calendar.getTime();
99 }
100
101 /**
102 * 获得指定日期之后一段时期的日期。例如某日期之后3天的日期等。
103 *
104 * @param origDate
105 * 基准日期
106 * @param amount
107 * 时间数量
108 * @param timeUnit
109 * 时间单位,如年、月、日等。用Calendar中的常量代表
110 * @return {@link Date}
111 */
112 public static final Date timeAfter(Date origDate, int amount, int timeUnit) {
113 Calendar calendar = Calendar.getInstance();
114 calendar.setTime(origDate);
115 calendar.add(timeUnit, amount);
116 return calendar.getTime();
117 }
118
119 /**
120 * 获得指定日期之前一段时期的日期。例如某日期之前3天的日期等。
121 *
122 * @param origDate
123 * 基准日期
124 * @param amount
125 * 时间数量
126 * @param timeUnit
127 * 时间单位,如年、月、日等。用Calendar中的常量代表
128 * @return {@link Date}
129 */
130 public static final Date dateBefore(Date origDate, int amount, int timeUnit) {
131 Calendar calendar = Calendar.getInstance();
132 calendar.add(timeUnit, -amount);
133 return calendar.getTime();
134 }
135
136 /**
137 * 根据年月日构建日期对象。注意月份是从1开始计数的,即month为1代表1月份。
138 *
139 * @param year
140 * 年
141 * @param month
142 * 月。注意1代表1月份,依此类推。
143 * @param day
144 * 日
145 * @return {@link Date}
146 */
147 public static Date date(int year, int month, int date) {
148 Calendar calendar = Calendar.getInstance();
149 calendar.set(year, month - 1, date, 0, 0, 0);
150 calendar.set(Calendar.MILLISECOND, 0);
151 return calendar.getTime();
152 }
153
154 /**
155 * 计算两个日期(不包括时间)之间相差的周年数
156 *
157 * @param date1
158 * 开始时间
159 * @param date2
160 * 结束时间
161 * @return {@link Integer}
162 */
163 public static int getYearDiff(Date date1, Date date2) {
164 if (date1 == null || date2 == null) {
165 throw new InvalidParameterException("date1 and date2 cannot be null!");
166 }
167 if (date1.after(date2)) {
168 throw new InvalidParameterException("date1 cannot be after date2!");
169 }
170
171 Calendar calendar = Calendar.getInstance();
172 calendar.setTime(date1);
173 int year1 = calendar.get(Calendar.YEAR);
174 int month1 = calendar.get(Calendar.MONTH);
175 int day1 = calendar.get(Calendar.DATE);
176
177 calendar.setTime(date2);
178 int year2 = calendar.get(Calendar.YEAR);
179 int month2 = calendar.get(Calendar.MONTH);
180 int day2 = calendar.get(Calendar.DATE);
181
182 int result = year2 - year1;
183 if (month2 < month1) {
184 result--;
185 } else if (month2 == month1 && day2 < day1) {
186 result--;
187 }
188 return result;
189 }
190
191 /**
192 * 计算两个日期(不包括时间)之间相差的整月数
193 *
194 * @param date1
195 * 开始时间
196 * @param date2
197 * 结束时间
198 * @return {@link Integer}
199 */
200 public static int getMonthDiff(Date date1, Date date2) {
201 if (date1 == null || date2 == null) {
202 throw new InvalidParameterException("date1 and date2 cannot be null!");
203 }
204 if (date1.after(date2)) {
205 throw new InvalidParameterException("date1 cannot be after date2!");
206 }
207
208 Calendar calendar = Calendar.getInstance();
209 calendar.setTime(date1);
210 int year1 = calendar.get(Calendar.YEAR);
211 int month1 = calendar.get(Calendar.MONTH);
212 int day1 = calendar.get(Calendar.DATE);
213
214 calendar.setTime(date2);
215 int year2 = calendar.get(Calendar.YEAR);
216 int month2 = calendar.get(Calendar.MONTH);
217 int day2 = calendar.get(Calendar.DATE);
218
219 int months = 0;
220 if (day2 >= day1) {
221 months = month2 - month1;
222 } else {
223 months = month2 - month1 - 1;
224 }
225 return (year2 - year1) * MONTHS_IN_A_YEAR + months;
226 }
227
228 /**
229 * 统计两个日期之间包含的天数。包含date1,但不包含date2
230 *
231 * @param date1
232 * 开始时间
233 * @param date2
234 * 结束时间
235 * @return {@link Integer}
236 * @throws ParseException
237 */
238 public static int getDayDiff(Date date1, Date date2) {
239 if (date1 == null || date2 == null) {
240 throw new InvalidParameterException("date1 and date2 cannot be null!");
241 }
242 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
243 Date smdate;
244 try {
245 smdate = sdf.parse(sdf.format(date1));
246 Date bdate = sdf.parse(sdf.format(date2));
247 Calendar cal = Calendar.getInstance();
248 cal.setTime(smdate);
249 long time1 = cal.getTimeInMillis();
250 cal.setTime(bdate);
251 long time2 = cal.getTimeInMillis();
252 long between_days = (time2 - time1) / (1000 * 3600 * 24);
253 return Integer.parseInt(String.valueOf(between_days));
254 } catch (ParseException e) {
255 e.printStackTrace();
256 }
257 return 0;
258 }
259
260 /**
261 * 计算time2比time1晚多少分钟,忽略日期部分
262 *
263 * @param time1
264 * @param time2
265 * @return
266 */
267 public static int getMinuteDiffByTime(Date time1, Date time2) {
268 long startMil = 0;
269 long endMil = 0;
270 Calendar calendar = Calendar.getInstance();
271 calendar.setTime(time1);
272 calendar.set(1900, 1, 1);
273 startMil = calendar.getTimeInMillis();
274 calendar.setTime(time2);
275 calendar.set(1900, 1, 1);
276 endMil = calendar.getTimeInMillis();
277 return (int) ((endMil - startMil) / MILLIS_IN_A_SECOND / SECONDS_IN_A_MINUTE);
278 }
279
280 /**
281 * 计算时间是否是同一天
282 *
283 * @param dateA
284 * @param dateB
285 * @return
286 */
287 public static boolean areSameDay(Date dateA, Date dateB) {
288 Calendar calDateA = Calendar.getInstance();
289 calDateA.setTime(dateA);
290
291 Calendar calDateB = Calendar.getInstance();
292 calDateB.setTime(dateB);
293
294 return calDateA.get(Calendar.YEAR) == calDateB.get(Calendar.YEAR)
295 && calDateA.get(Calendar.MONTH) == calDateB.get(Calendar.MONTH)
296 && calDateA.get(Calendar.DAY_OF_MONTH) == calDateB.get(Calendar.DAY_OF_MONTH);
297 }
298
299 /**
300 * @Title: getCurrYearLast
301 * @Description: 获取某年最后一天
302 * @param date
303 * @return Date
304 */
305 public static Date getCurrYearLast(Date date) {
306 Calendar currCal = Calendar.getInstance();
307 currCal.setTime(date);
308 int currentYear = currCal.get(Calendar.YEAR);
309 return getYearLast(currentYear);
310 }
311
312 private static Date getYearLast(int year) {
313 Calendar calendar = Calendar.getInstance();
314 calendar.clear();
315 calendar.set(Calendar.YEAR, year);
316
317 calendar.roll(Calendar.DAY_OF_YEAR, -1);
318 // 将小时至0
319 calendar.set(Calendar.HOUR_OF_DAY, 23);
320 // 将分钟至0
321 calendar.set(Calendar.MINUTE, 59);
322 // 将秒至0
323 calendar.set(Calendar.SECOND, 59);
324 // 将毫秒至0
325 calendar.set(Calendar.MILLISECOND, 0);
326
327 Date currYearLast = calendar.getTime();
328 return currYearLast;
329 }
330 /*
331 * private static Date getYearLast(int year) { Calendar calendar =
332 * Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.YEAR,
333 * year); calendar.roll(Calendar.DAY_OF_YEAR, -1); Date currYearLast =
334 * calendar.getTime(); return currYearLast; }
335 */
336 /**
337 *
338 * @param args
339 * @throws ParseException
340 *
341 * 根据结算周期数 对开始时间与结束时间进行分段
342 */
343 public static void main(String[] args) throws ParseException {
344 /*开始时间*/
345 Date startDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-1-20 10:31:36");
346 /*结束时间*/
347 Date endDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-5-12 10:31:36");
348 /*周期数*/
349 int solt = 2;
350 ArrayList<Map<String, Object>> list = new ArrayList<>();
351
352 while (startDate.getTime()<endDate.getTime()) {
353 Map<String, Object> map = new HashMap<>();
354 map.put("开始时间",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startDate));
355 startDate=dateAfter(startDate, solt, Calendar.MONTH);
356 if (startDate.getTime()>endDate.getTime()) {
357 map.put("结束时间",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(endDate));
358
359 } else {
360 map.put("结束时间",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startDate));
361 }
362 list.add(map);
363 }
364 System.out.println(list);
365 }
366 }