1 package com.liveyc.common.utils;
2
3 import java.text.ParseException;
4 import java.text.SimpleDateFormat;
5 import java.util.ArrayList;
6 import java.util.Calendar;
7 import java.util.Date;
8 import java.util.HashMap;
9 import java.util.List;
10 import java.util.Map;
11
12 /**
13 * @module 系统模块
14 * @func 日期处理类
15 * @author chenjian
16 */
17 public class DateUtils {
18 private static String ymdhms = "yyyy-MM-dd HH:mm:ss";
19 private static String ymd = "yyyy-MM-dd";
20 public static SimpleDateFormat ymdSDF = new SimpleDateFormat(ymd);
21 private static String year = "yyyy";
22 private static String month = "MM";
23 private static String day = "dd";
24 public static SimpleDateFormat yyyyMMddHHmmss = new SimpleDateFormat(ymdhms);
25 public static SimpleDateFormat yearSDF = new SimpleDateFormat(year);
26 public static SimpleDateFormat monthSDF = new SimpleDateFormat(month);
27 public static SimpleDateFormat daySDF = new SimpleDateFormat(day);
28
29 public static SimpleDateFormat yyyyMMddHHmm = new SimpleDateFormat("yyyy-MM-dd HH:mm");
30
31 public static SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyy-MM-dd");
32
33 public static SimpleDateFormat yyyyMMddHH_NOT_ = new SimpleDateFormat("yyyyMMdd");
34
35 public static long DATEMM = 86400L;
36
37
38
39 /**
40 * 获得当前时间 格式:2014-12-02 10:38:53
41 *
42 * @return String
43 */
44 public static String getCurrentTime() {
45 return yyyyMMddHHmmss.format(new Date());
46 }
47
48 /**
49 * 可以获取昨天的日期 格式:2014-12-01
50 *
51 * @return String
52 */
53 public static String getYesterdayYYYYMMDD() {
54 Date date = new Date(System.currentTimeMillis() - DATEMM * 1000L);
55 String str = yyyyMMdd.format(date);
56 try {
57 date = yyyyMMddHHmmss.parse(str + " 00:00:00");
58 return yyyyMMdd.format(date);
59 } catch (ParseException e) {
60 e.printStackTrace();
61 }
62 return "";
63 }
64
65 /**
66 * 可以获取后退N天的日期 格式:传入2 得到2014-11-30
67 *
68 * @param backDay
69 * @return String
70 */
71 public String getStrDate(String backDay) {
72 Calendar calendar = Calendar.getInstance();
73 calendar.add(Calendar.DATE, Integer.parseInt("-" + backDay));
74 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
75 String back = sdf.format(calendar.getTime());
76 return back;
77 }
78
79 /**
80 * 获取当前的年、月、日
81 *
82 * @return String
83 */
84 public static String getCurrentYear() {
85 return yearSDF.format(new Date());
86 }
87
88 public static String getCurrentMonth() {
89 return monthSDF.format(new Date());
90 }
91
92 public static String getCurrentDay() {
93 return daySDF.format(new Date());
94 }
95
96 /**
97 * 字符转日期
98 * @param str
99 * @return
100 */
101 public static Date StrToDate(String str) {
102 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
103 Date date = null;
104 try {
105 date = format.parse(str);
106 } catch (ParseException e) {
107 e.printStackTrace();
108 }
109 return date;
110 }
111
112 /**
113 * 得到月份的最大天数
114 *
115 * @param date
116 * @return
117 */
118 public static int getDaysOfMonth(Date date) {
119 Calendar calendar = Calendar.getInstance();
120 calendar.setTime(date);
121 return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
122 }
123
124 /**
125 * 获取年月日 也就是当前时间 格式:2014-12-02
126 *
127 * @return String
128 */
129 public static String getCurrentymd() {
130 return ymdSDF.format(new Date());
131 }
132
133 /**
134 * 获取今天0点开始的秒数
135 *
136 * @return long
137 */
138 public static long getTimeNumberToday() {
139 Date date = new Date();
140 String str = yyyyMMdd.format(date);
141 try {
142 date = yyyyMMdd.parse(str);
143 return date.getTime() / 1000L;
144 } catch (ParseException e) {
145 e.printStackTrace();
146 }
147 return 0L;
148 }
149
150 /**
151 * 获取今天的日期 格式:20141202
152 *
153 * @return String
154 */
155 public static String getTodateString() {
156 String str = yyyyMMddHH_NOT_.format(new Date());
157 return str;
158 }
159
160 /**
161 * 获取昨天的日期 格式:20141201
162 *
163 * @return String
164 */
165 public static String getYesterdayString() {
166 Date date = new Date(System.currentTimeMillis() - DATEMM * 1000L);
167 String str = yyyyMMddHH_NOT_.format(date);
168 return str;
169 }
170
171 /**
172 * 获得昨天零点
173 *
174 * @return Date
175 */
176 public static Date getYesterDayZeroHour() {
177 Calendar cal = Calendar.getInstance();
178 cal.add(Calendar.DATE, -1);
179 cal.set(Calendar.SECOND, 0);
180 cal.set(Calendar.MINUTE, 0);
181 cal.set(Calendar.HOUR, 0);
182 return cal.getTime();
183 }
184
185 /**
186 * 把long型日期转String ;---OK
187 *
188 * @param date
189 * long型日期;
190 * @param format
191 * 日期格式;
192 * @return
193 */
194 public static String longToString(long date, String format) {
195 SimpleDateFormat sdf = new SimpleDateFormat(format);
196 // 前面的lSysTime是秒数,先乘1000得到毫秒数,再转为java.util.Date类型
197 java.util.Date dt2 = new Date(date * 1000L);
198 String sDateTime = sdf.format(dt2); // 得到精确到秒的表示:08/31/2006 21:08:00
199 return sDateTime;
200 }
201
202 /**
203 * 获得今天零点
204 *
205 * @return Date
206 */
207 public static Date getTodayZeroHour() {
208 Calendar cal = Calendar.getInstance();
209 cal.set(Calendar.SECOND, 0);
210 cal.set(Calendar.MINUTE, 0);
211 cal.set(Calendar.HOUR, 0);
212 return cal.getTime();
213 }
214
215 /**
216 * 获得昨天23时59分59秒
217 *
218 * @return
219 */
220 public static Date getYesterDay24Hour() {
221 Calendar cal = Calendar.getInstance();
222 cal.add(Calendar.DATE, -1);
223 cal.set(Calendar.SECOND, 59);
224 cal.set(Calendar.MINUTE, 59);
225 cal.set(Calendar.HOUR, 23);
226 return cal.getTime();
227 }
228
229 /**
230 * String To Date ---OK
231 *
232 * @param date
233 * 待转换的字符串型日期;
234 * @param format
235 * 转化的日期格式
236 * @return 返回该字符串的日期型数据;
237 */
238 public static Date stringToDate(String date, String format) {
239 SimpleDateFormat sdf = new SimpleDateFormat(format);
240 try {
241 return sdf.parse(date);
242 } catch (ParseException e) {
243 return null;
244 }
245 }
246
247 /**
248 * 获得指定日期所在的自然周的第一天,即周日
249 *
250 * @param date
251 * 日期
252 * @return 自然周的第一天
253 */
254 public static Date getStartDayOfWeek(Date date) {
255 Calendar c = Calendar.getInstance();
256 c.setTime(date);
257 c.set(Calendar.DAY_OF_WEEK, 1);
258 date = c.getTime();
259 return date;
260 }
261
262 /**
263 * 获得指定日期所在的自然周的最后一天,即周六
264 *
265 * @param date
266 * @return
267 */
268 public static Date getLastDayOfWeek(Date date) {
269 Calendar c = Calendar.getInstance();
270 c.setTime(date);
271 c.set(Calendar.DAY_OF_WEEK, 7);
272 date = c.getTime();
273 return date;
274 }
275
276 /**
277 * 获得指定日期所在当月第一天
278 *
279 * @param date
280 * @return
281 */
282 public static Date getStartDayOfMonth(Date date) {
283 Calendar c = Calendar.getInstance();
284 c.setTime(date);
285 c.set(Calendar.DAY_OF_MONTH, 1);
286 date = c.getTime();
287 return date;
288 }
289
290 /**
291 * 获得指定日期所在当月最后一天
292 *
293 * @param date
294 * @return
295 */
296 public static Date getLastDayOfMonth(Date date) {
297 Calendar c = Calendar.getInstance();
298 c.setTime(date);
299 c.set(Calendar.DATE, 1);
300 c.add(Calendar.MONTH, 1);
301 c.add(Calendar.DATE, -1);
302 date = c.getTime();
303 return date;
304 }
305
306 /**
307 * 获得指定日期的下一个月的第一天
308 *
309 * @param date
310 * @return
311 */
312 public static Date getStartDayOfNextMonth(Date date) {
313 Calendar c = Calendar.getInstance();
314 c.setTime(date);
315 c.add(Calendar.MONTH, 1);
316 c.set(Calendar.DAY_OF_MONTH, 1);
317 date = c.getTime();
318 return date;
319 }
320
321 /**
322 * 获得指定日期的下一个月的最后一天
323 *
324 * @param date
325 * @return
326 */
327 public static Date getLastDayOfNextMonth(Date date) {
328 Calendar c = Calendar.getInstance();
329 c.setTime(date);
330 c.set(Calendar.DATE, 1);
331 c.add(Calendar.MONTH, 2);
332 c.add(Calendar.DATE, -1);
333 date = c.getTime();
334 return date;
335 }
336
337 /**
338 *
339 * 求某一个时间向前多少秒的时间(currentTimeToBefer)---OK
340 *
341 * @param givedTime
342 * 给定的时间
343 * @param interval
344 * 间隔时间的毫秒数;计算方式 :n(天)*24(小时)*60(分钟)*60(秒)(类型)
345 * @param format_Date_Sign
346 * 输出日期的格式;如yyyy-MM-dd、yyyyMMdd等;
347 */
348 public static String givedTimeToBefer(String givedTime, long interval, String format_Date_Sign) {
349 String tomorrow = null;
350 try {
351 SimpleDateFormat sdf = new SimpleDateFormat(format_Date_Sign);
352 Date gDate = sdf.parse(givedTime);
353 long current = gDate.getTime(); // 将Calendar表示的时间转换成毫秒
354 long beforeOrAfter = current - interval * 1000L; // 将Calendar表示的时间转换成毫秒
355 Date date = new Date(beforeOrAfter); // 用timeTwo作参数构造date2
356 tomorrow = new SimpleDateFormat(format_Date_Sign).format(date);
357 } catch (ParseException e) {
358 e.printStackTrace();
359 }
360 return tomorrow;
361 }
362
363 /**
364 * 把String 日期转换成long型日期;---OK
365 *
366 * @param date
367 * String 型日期;
368 * @param format
369 * 日期格式;
370 * @return
371 */
372 public static long stringToLong(String date, String format) {
373 SimpleDateFormat sdf = new SimpleDateFormat(format);
374 Date dt2 = null;
375 long lTime = 0;
376 try {
377 dt2 = sdf.parse(date);
378 // 继续转换得到秒数的long型
379 lTime = dt2.getTime() / 1000;
380 } catch (ParseException e) {
381 e.printStackTrace();
382 }
383
384 return lTime;
385 }
386
387 /**
388 * 根据结束时间以及间隔差值,求符合要求的日期集合;
389 *
390 * @param endTime
391 * @param interval
392 * @param isEndTime
393 * @return
394 */
395 public static Map<String, String> getDate(String endTime, Integer interval, boolean isEndTime) {
396 Map<String, String> result = new HashMap<String, String>();
397 if (interval == 0 || isEndTime) {
398 if (isEndTime)
399 result.put(endTime, endTime);
400 }
401 if (interval > 0) {
402 int begin = 0;
403 for (int i = begin; i < interval; i++) {
404 endTime = givedTimeToBefer(endTime, DATEMM, ymd);
405 result.put(endTime, endTime);
406 }
407 }
408 return result;
409 }
410
411
412 /**
413 * @Description: 输出指定两个日期之间的所有日期
414 * @Title: process
415 * @author: xuyou
416 * @date: 2017年12月12日
417 * @param date1 开始时间
418 * @param date2 结束时间
419 * @return
420 * @throws Exception
421 */
422 public static List<String> process(String date1, String date2) throws Exception {
423 List<String> list = new ArrayList<String>();
424 //如果两个时间相同
425 if (date1.equals(date2)) {
426 list.add(date1);
427 return list;
428 }
429
430 String tmp;
431 if (date1.compareTo(date2) > 0) { // 确保 date1的日期不晚于date2
432 tmp = date1;
433 date1 = date2;
434 date2 = tmp;
435 }
436
437 tmp = yyyyMMddHH_NOT_.format(str2Date(date1).getTime() + 3600 * 24 * 1000);
438 list.add(date1);
439 while (tmp.compareTo(date2) < 0) {
440 list.add(tmp);
441 tmp = yyyyMMddHH_NOT_.format(str2Date(tmp).getTime() + 3600 * 24 * 1000);
442 }
443 list.add(date2);
444 return list;
445 }
446
447 public static Date str2Date(String str) {
448 if (str == null)
449 return null;
450 try {
451 return yyyyMMddHH_NOT_.parse(str);
452 } catch (ParseException e) {
453 e.printStackTrace();
454 }
455 return null;
456 }
457
458 }