1 /**
2 * 格式化字符串为日期格式
3 *
4 * @param dateStr 需要格式化的字符串
5 * @param format 需要的日期格式,例如"yyyy-MM-dd HH:mm:ss"
6 * @return
7 */
8 public static Date formatDate(String dateStr, String format) {
9 SimpleDateFormat dateFormat = new SimpleDateFormat(format,
10 Locale.CHINESE);
11 try {
12 return dateFormat.parse(dateStr);
13 } catch (ParseException e) {
14 e.printStackTrace();
15 }
16
17 return null;
18 }
19
20 /**
21 * 格式化字符串为"yyyy-MM-dd HH:mm:ss"的日期
22 *
23 * @param dateStr
24 * @return
25 */
26 public static Date formatDate(String dateStr) {
27 if(StrUtil.isBlank(dateStr)){
28 return null;
29 }
30 return formatDate(dateStr, "yyyy-MM-dd HH:mm:ss");
31 }
32
33 public static String getFormatDateStr(long date, String format) {
34 return formatDate2Str(new Date(date), format);
35 }
36
37 public static String getMonthDayStr(Date date) {
38 if (date == null) {
39 return "";
40 }
41 return formatDate2Str(date, "MM-dd");
42 }
43
44 public static String getNormalDateStr(Date date) {
45 if (date == null) {
46 return "";
47 }
48 return formatDate2Str(date, "yyyy-MM-dd HH:mm:ss");
49 }
50
51 public static String formatDate2Str(Date date, String formatter) {
52 SimpleDateFormat sdf = new SimpleDateFormat(formatter);
53 return sdf.format(date);
54 }
55
56 /**
57 * date 日期加上,或减去几天
58 *
59 * @param date
60 * @param day
61 * @return
62 */
63 public static Date addDateInDiff(Date date, int day) {
64 Calendar cal = Calendar.getInstance();
65 cal.setTime(date);
66 cal.add(Calendar.DATE, day);
67 return cal.getTime();
68 }
69
70 public static Date addMinuteInDiff(Date date, int minute) {
71 Calendar cal = Calendar.getInstance();
72 cal.setTime(date);
73 cal.add(Calendar.MINUTE, minute);
74 return cal.getTime();
75 }
76
77 public static Date addSecondInDiff(Date date, int sec) {
78 Calendar cal = Calendar.getInstance();
79 cal.setTime(date);
80 cal.add(Calendar.SECOND, sec);
81 return cal.getTime();
82 }
83
84 /**
85 * 日期加个月
86 *
87 * @param date
88 * @param mon
89 * @return
90 */
91 public static Date addMonthInDiff(Date date, int mon) {
92 Calendar cal = Calendar.getInstance();
93 cal.setTime(date);
94 cal.add(Calendar.MONTH, mon);
95 return cal.getTime();
96 }
97
98 public static Date addYearInDiff(Date date, int mon) {
99 Calendar cal = Calendar.getInstance();
100 cal.setTime(date);
101 cal.add(Calendar.YEAR, mon);
102 return cal.getTime();
103 }
104
105 /**
106 * 获取当前日期是星期几<br>
107 *
108 * @param dt
109 * @return 当前日期是星期几
110 */
111 public static String getWeekOfDate(Date dt) {
112 String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
113 Calendar cal = Calendar.getInstance();
114 cal.setTime(dt);
115 int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
116 if (w < 0)
117 w = 0;
118 return weekDays[w];
119 }
120
121 /**
122 * 获取当前日期是周几<br>
123 *
124 * @param dt
125 * @return 当前日期是周几
126 */
127 public static String getWeekOfDate2(Date dt) {
128 String[] weekDays = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};
129 Calendar cal = Calendar.getInstance();
130 cal.setTime(dt);
131 int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
132 if (w < 0)
133 w = 0;
134 return weekDays[w];
135 }
136
137 /**
138 * <pre>
139 * 判断date和当前日期是否在同一周内
140 * 注:
141 * Calendar类提供了一个获取日期在所属年份中是第几周的方法,对于上一年末的某一天
142 * 和新年初的某一天在同一周内也一样可以处理,例如2012-12-31和2013-01-01虽然在
143 * 不同的年份中,但是使用此方法依然判断二者属于同一周内
144 * </pre>
145 *
146 * @param date
147 * @return
148 */
149 public static boolean isSameWeekWithToday(Date date) {
150 return isSameWeek(date, new Date());
151 }
152
153 public static boolean isSameWeek(Date date1, Date date2) {
154 if (date1 == null || date2 == null) {
155 return false;
156 }
157
158 // 0.先把Date类型的对象转换Calendar类型的对象
159 Calendar date1Cal = Calendar.getInstance();
160 Calendar date2Cal = Calendar.getInstance();
161
162 date1Cal.setTime(date1);
163 date2Cal.setTime(date2);
164
165 // 1.比较当前日期在年份中的周数是否相同
166 if (date1Cal.get(Calendar.WEEK_OF_YEAR) == date2Cal
167 .get(Calendar.WEEK_OF_YEAR)) {
168 return true;
169 } else {
170 return false;
171 }
172 }
173
174 /**
175 * 取得当前日期所在周的第一天
176 *
177 * @param date
178 * @return
179 */
180 public static Date getFirstDayOfWeek(Date date) {
181 Calendar c = new GregorianCalendar();
182 c.setFirstDayOfWeek(Calendar.MONDAY);
183 c.setTime(date);
184 c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); // Monday
185 return c.getTime();
186 }
187
188 /**
189 * 取得当前日期是多少周
190 *
191 * @param date
192 * @return
193 */
194 public static int getWeekOfYear(Date date) {
195 Calendar c = new GregorianCalendar();
196 c.setFirstDayOfWeek(Calendar.MONDAY);
197 c.setMinimalDaysInFirstWeek(7);
198 c.setTime(date);
199
200 return c.get(Calendar.WEEK_OF_YEAR);
201 }
202
203 /**
204 * 得到某一年周的总数
205 *
206 * @param year
207 * @return
208 */
209 public static int getMaxWeekNumOfYear(int year) {
210 Calendar c = new GregorianCalendar();
211 c.set(year, Calendar.DECEMBER, 31, 23, 59, 59);
212
213 return getWeekOfYear(c.getTime());
214 }
215
216 /**
217 * 得到某年某周的第一天
218 *
219 * @param year
220 * @param week
221 * @return
222 */
223 public static Date getFirstDayOfWeek(int year, int week) {
224 Calendar c = new GregorianCalendar();
225 c.set(Calendar.YEAR, year);
226 c.set(Calendar.MONTH, Calendar.JANUARY);
227 c.set(Calendar.DATE, 1);
228
229 Calendar cal = (GregorianCalendar) c.clone();
230 cal.add(Calendar.DATE, week * 7);
231
232 return getFirstDayOfWeek(cal.getTime());
233 }
234
235 /**
236 * 得到某年某周的最后一天
237 *
238 * @param year
239 * @param week
240 * @return
241 */
242 public static Date getLastDayOfWeek(int year, int week) {
243 Calendar c = new GregorianCalendar();
244 c.set(Calendar.YEAR, year);
245 c.set(Calendar.MONTH, Calendar.JANUARY);
246 c.set(Calendar.DATE, 1);
247
248 Calendar cal = (GregorianCalendar) c.clone();
249 cal.add(Calendar.DATE, week * 7);
250
251 return getLastDayOfWeek(cal.getTime());
252 }
253
254 /**
255 * 取得当前日期所在周的最后一天
256 *
257 * @param date
258 * @return
259 */
260 public static Date getLastDayOfWeek(Date date) {
261 Calendar c = new GregorianCalendar();
262 c.setFirstDayOfWeek(Calendar.MONDAY);
263 c.setTime(date);
264 c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); // Sunday
265 return c.getTime();
266 }
267
268 /**
269 * 获得当前日期所在月份的最后一天(最后一个day)
270 *
271 * @param date
272 * @return Date
273 */
274 public static Date getLastDayOfMonth(Date date) {
275 Calendar ca = Calendar.getInstance();
276 ca.setTime(date);
277 ca.set(Calendar.DAY_OF_MONTH,
278 ca.getActualMaximum(Calendar.DAY_OF_MONTH));
279 return ca.getTime();
280 }
281
282 public static Date getFirstDayOfMonth(Date date) {
283 Calendar c = Calendar.getInstance();
284 c.add(Calendar.MONTH, 0);
285 c.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
286 return c.getTime();
287 }
288
289 /**
290 * 获取两个日期之间的天数
291 *
292 * @param startDate
293 * @param endDate
294 * @return
295 */
296 public static Long getDaysBetween(Date startDate, Date endDate) {
297 Calendar fromCalendar = Calendar.getInstance();
298 fromCalendar.setTime(startDate);
299 fromCalendar.set(Calendar.HOUR_OF_DAY, 0);
300 fromCalendar.set(Calendar.MINUTE, 0);
301 fromCalendar.set(Calendar.SECOND, 0);
302 fromCalendar.set(Calendar.MILLISECOND, 0);
303
304 Calendar toCalendar = Calendar.getInstance();
305 toCalendar.setTime(endDate);
306 toCalendar.set(Calendar.HOUR_OF_DAY, 0);
307 toCalendar.set(Calendar.MINUTE, 0);
308 toCalendar.set(Calendar.SECOND, 0);
309 toCalendar.set(Calendar.MILLISECOND, 0);
310
311 return (toCalendar.getTime().getTime() - fromCalendar.getTime()
312 .getTime()) / (1000 * 60 * 60 * 24);
313 }
314
315 /**
316 * 计算两个分钟差
317 *
318 * @return
319 */
320 public static Long getMinutesBetween(Date startDate, Date endDate) {
321 long diff = startDate.getTime() - endDate.getTime();//这样得到的差值是微秒级别
322 long days = diff / (1000 * 60 * 60 * 24);
323
324 long hours = (diff - days * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
325 long minutes = diff / (1000 * 60);
326 System.out.println("" + days + "天" + hours + "小时" + minutes + "分");
327 return minutes;
328 }
329
330 /**
331 * 计算两个小时差
332 *
333 * @return
334 */
335 public static Long getHourBetween(Date startDate, Date endDate) {
336 long diff = startDate.getTime() - endDate.getTime();//这样得到的差值是微秒级别
337 long days = diff / (1000 * 60 * 60 * 24);
338
339 long hours = diff / (1000 * 60 * 60);
340 System.out.println("" + days + "天" + hours + "小时" + "分");
341 return hours;
342 }
343
344 /**
345 * 计算两个秒差
346 *
347 * @return
348 */
349 public static Long getSecondBetween(Date startDate, Date endDate) {
350 long diff = startDate.getTime() - endDate.getTime();//这样得到的差值是微秒级别
351 long seconds = diff / (1000);
352 return seconds;
353 }
354
355 /**
356 * 日期转换为今天,明天,后天
357 * startDate (2018-09-10 00:00:00)
358 */
359 public static String getDateDesc(Date startDate) {
360 String todayStr = formatDate2Str(new Date(), "yyyy-MM-dd");
361 Date today = formatDate(todayStr + " 00:00:00");
362 long days = getDaysBetween(today, startDate);
363 if (days == 0) {
364 return "今天";
365 } else if (days == 1) {
366 return "明天";
367 } else if (days == 2) {
368 return "后天";
369 }
370 return formatDate2Str(startDate, "yyyy-MM-dd");
371 }
372
373 /**
374 * 显示时间,如果与当前时间差别小于一天,则自动用**秒(分,小时)前,如果大于一天则用format规定的格式显示
375 *
376 * @param ctime 时间
377 * @param format 格式 格式描述:例如:yyyy-MM-dd yyyy-MM-dd HH:mm:ss
378 * @return
379 */
380 public static String showTime(Date ctime, String format) {
381 // System.out.println("当前时间是:"+new
382 // Timestamp(System.currentTimeMillis()));
383
384 // System.out.println("发布时间是:"+df.format(ctime).toString());
385 String r = "";
386 if (ctime == null)
387 return r;
388 if (format == null)
389 format = "MM-dd HH:mm";
390
391 boolean isSameYear = isSameYear(ctime, new Date());
392 if (!isSameYear) {
393 format = "yy-M-d";
394 SimpleDateFormat df = new SimpleDateFormat(format);
395 return df.format(ctime);
396 }
397
398 long nowtimelong = System.currentTimeMillis();
399
400 long ctimelong = ctime.getTime();
401 long result = Math.abs(nowtimelong - ctimelong);
402
403 if (result < 60000) {// 一分钟内
404 // long seconds = result / 1000;
405 // if(seconds == 0){
406 // r = "刚刚";
407 // }else{
408 // r = seconds + "秒前";
409 // }
410 r = "刚刚";
411 } else if (result >= 60000 && result < 3600000) {// 一小时内
412 long seconds = result / 60000;
413 r = seconds + "分钟前";
414 } else if (result >= 3600000 && result < 86400000) {// 一天内
415 long seconds = result / 3600000;
416 r = seconds + "小时前";
417 } else if (result > 86400000 && result < 172800000) {// 三十天内
418 // long seconds = result / 86400000;
419 // r = seconds + "天前";
420 r = "昨天";
421 } else if (result >= 172800000) {
422 // format = "M-d";
423 SimpleDateFormat df = new SimpleDateFormat(format);
424 r = df.format(ctime).toString();
425 }
426 // else{// 日期格式
427 // format="MM-dd HH:mm";
428 // SimpleDateFormat df = new SimpleDateFormat(format);
429 // r = df.format(ctime).toString();
430 // }
431 return r;
432 }
433
434 public static boolean isSameYear(Date ctime, Date nTime) {
435 Calendar cDate = Calendar.getInstance();
436 cDate.setTime(ctime);
437 Calendar nDate = Calendar.getInstance();
438 nDate.setTime(nTime);
439 int cYear = cDate.get(Calendar.YEAR);
440 int nYear = nDate.get(Calendar.YEAR);
441 if (cYear == nYear) {
442 return true;
443 }
444 return false;
445 }
446
447 /***
448 * 出生日期转换年龄
449 ***/
450 public static int getAgeByBirthday(Date birthday) {
451 Calendar cal = Calendar.getInstance();
452 if (birthday.getTime() > new Date().getTime()) {
453 return 0;
454 }
455 int year = cal.get(Calendar.YEAR);
456 int month = cal.get(Calendar.MONTH) + 1;
457 int day = cal.get(Calendar.DAY_OF_MONTH);
458
459 cal.setTime(birthday);
460 int yearBirth = cal.get(Calendar.YEAR);
461 int monthBirth = cal.get(Calendar.MONTH) + 1;
462 int dayBirth = cal.get(Calendar.DAY_OF_MONTH);
463 int age = year - yearBirth;
464 if (monthBirth > month)
465 return age - 1;
466 if (monthBirth == month && dayBirth > day)
467 return age - 1;
468 return age > 0 ? age : 0;
469 }
470
471 /***
472 * 根据年龄取得出生日期
473 *
474 * @param age
475 * @return
476 */
477 public static String getBirthdayByAge(int age) {
478 Calendar cal = Calendar.getInstance();
479 int year = cal.get(Calendar.YEAR);
480 int month = cal.get(Calendar.MONTH) + 1;
481 int day = cal.get(Calendar.DAY_OF_MONTH);
482 int birthYear = year - age;
483 Date birthDay = formatDate(birthYear + "-" + month + "-" + day,
484 "yyyy-MM-dd");
485 return formatDate2Str(birthDay, "yyyy-MM-dd");
486 }
487
488
489 /**
490 * 判断结束时间是否早于当前时间
491 **/
492 public static boolean isTimeout(String date) {
493 if (date == null)
494 return false;
495 long now = new Date().getTime();
496 long end = formatDate(date.toString()).getTime();
497 if (now > end)
498 return true;
499 return false;
500 }
501
502 /**
503 * @param date
504 * @return
505 */
506 public static boolean isTimeout(Date date) {
507 if (date == null) return false;
508 long now = new Date().getTime();
509 long end = date.getTime();
510 if (now > end) return true;
511 return false;
512 }
513
514 /**
515 * 判断date2时间是否早于date1时间
516 **/
517 public static boolean isTimeout(String date1, String date2) {
518 if (date1 == null || date2 == null)
519 return false;
520 long start = formatDate(date2.toString()).getTime();
521 long end = formatDate(date1.toString()).getTime();
522 if (start > end)
523 return true;
524 return false;
525 }
526
527 /**
528 * 判断传入的时间是否已满一周年
529 */
530 public static boolean isLastYear(Date date) {
531 Calendar calendar = Calendar.getInstance();
532 Date lastYear = new Date(System.currentTimeMillis());
533 calendar.setTime(lastYear);
534 calendar.add(Calendar.YEAR, -1);
535 lastYear = calendar.getTime();
536 if (date.getTime() < lastYear.getTime()) {
537 return true;
538 }
539 return false;
540 }
541
542 public static int getSpecVoteFailTime() {
543 Date nowDate = new Date();
544 Date addDateInDiff = addDateInDiff(nowDate, 1);
545 String endDateStr = formatDate2Str(addDateInDiff, "yyyy-MM-dd") + " 00:00:00";
546 Date formatDate = formatDate(endDateStr);
547 long time1 = formatDate.getTime();
548 long time2 = nowDate.getTime();
549 long abs = Math.abs(time1 - time2);
550 long l = abs / 1000;
551 return Integer.valueOf(String.valueOf(l));
552 }
553
554 //2018-09-17 9时 转成日期格式
555 public static String convertShowTimeToDate(String date) {
556 StringBuilder str = new StringBuilder();
557 str.append(date);
558 if (date.length() == 13) {
559 str.insert(11, 0);
560 }
561 date = date.replace("时", ":00:00");
562 System.out.println(date);
563 return date;
564 }
565
566 //日期格式转成2018-09-17 9时
567 public static String convertDateToShowTime(Date date) {
568 String dateStr = UtilDate.formatDate2Str(date, "yyyy-MM-dd HH");
569 String regx = "\\s0";
570 dateStr = dateStr.replaceAll(regx, " ") + "时";
571 System.out.println(dateStr);
572 return dateStr;
573 }
574
575
576 /**
577 * 第几个工作日
578 *
579 * @param date
580 * @param days
581 * @return
582 */
583 public static Date getWorkDte(Date date, int days) {
584
585 Calendar calendar = Calendar.getInstance();
586 calendar.setTime(date);
587 if (days > 0) {
588 for (int i = 1; i <= days; i++) {
589 calendar.add(Calendar.DAY_OF_YEAR, 1);
590 if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
591 i--;
592 }
593 }
594 } else if (days < 0) {
595 for (int i = 0; i > days; i--) {
596 calendar.add(Calendar.DAY_OF_YEAR, -1);
597 if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
598 i++;
599 }
600 }
601 }
602 return calendar.getTime();
603 }
604
605 /**
606 * 几小时几分钟
607 *
608 * @param seconds
609 * @return
610 */
611 public static String getTimeStrBySeconds(int seconds) {
612 String timeStr = "";
613 int hour = seconds / (60 * 60);
614 int minute = seconds % (60 * 60) / 60;
615 if (0 == hour) {
616 timeStr = seconds % (60 * 60) / 60 + "分钟";
617
618 } else {
619 timeStr = seconds / (60 * 60) + "小时" + seconds % (60 * 60) / 60 + "分钟";
620
621 }
622 return timeStr;
623 }
624
625 //判断选择的日期是否是本周
626 public static boolean isThisWeek(long time)
627 {
628 Calendar calendar = Calendar.getInstance();
629 int currentWeek = calendar.get(Calendar.WEEK_OF_YEAR);
630 calendar.setTime(new Date(time));
631 int paramWeek = calendar.get(Calendar.WEEK_OF_YEAR);
632 if(paramWeek==currentWeek){
633 return true;
634 }
635 return false;
636 }
637 //判断选择的日期是否是今天
638 public static boolean isToday(long time)
639 {
640 return isThisTime(time,"yyyy-MM-dd");
641 }
642 //判断选择的日期是否是本月
643 public static boolean isThisMonth(long time)
644 {
645 return isThisTime(time,"yyyy-MM");
646 }
647 private static boolean isThisTime(long time,String pattern) {
648 Date date = new Date(time);
649 SimpleDateFormat sdf = new SimpleDateFormat(pattern);
650 String param = sdf.format(date);//参数时间
651 String now = sdf.format(new Date());//当前时间
652 if(param.equals(now)){
653 return true;
654 }
655 return false;
656 }
657
658 /**
659 * 当天时间获取时分
660 * @return
661 */
662 public static String getIsTodayStartTime(Date date){
663 // Date date = UtilDate.formatDate(time, "yyyy-MM-dd HH:mm");
664 long time1 = date.getTime();
665 boolean today = UtilDate.isToday(time1);
666 String todayTime = UtilDate.getFormatDateStr(date.getTime(),"yyyy-MM-dd HH:mm");
667 if (today){
668
669 String regex = " ";
670 String[] split = todayTime.split(regex);
671 return "今天 " + split[1];
672 }
673 return todayTime;
674 }
675
676 /**
677 * 当天时间获取时分
678 * @return
679 */
680 public static String getIsTodayEndTime(Date date){
681 // Date date = UtilDate.formatDate(time, "yyyy-MM-dd HH:mm");
682 long time1 = date.getTime();
683 boolean today = UtilDate.isToday(time1);
684 String todayTime = UtilDate.getFormatDateStr(date.getTime(),"yyyy-MM-dd HH:mm");
685 if (today){
686 String regex = " ";
687 String[] split = todayTime.split(regex);
688 return split[1];
689 }
690 return todayTime.substring(11);
691 }