1 package com.qinjia.finance.base.util;
2
3 import org.apache.commons.lang.StringUtils;
4
5 import java.text.DateFormat;
6 import java.text.ParseException;
7 import java.text.SimpleDateFormat;
8 import java.util.Calendar;
9 import java.util.Date;
10 import java.util.HashMap;
11 import java.util.Map;
12
13
14 /**
15 * 日期相关操作
16 */
17 public class DateUtil {
18
19
20 private static DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
21
22 public final static String STYLE_1 = "yyyy-MM-dd HH:mm:ss";
23
24 public final static String STYLE_2 = "yyyy-MM-dd";
25
26 public final static String STYLE_3 = "yyyyMMdd";
27
28 public final static String STYLE_4 = "yyyyMMddhh";
29
30 public final static String STYLE_5 = "yyyyMMddhhmmss";
31
32 public final static String STYLE_6 = "yyyy年MM月dd日HH时mm分ss秒";
33
34 public final static String STYLE_7 = "yyyy年MM月dd日HH时mm分";
35
36 public final static String STYLE_8 = "yyyy年MM月dd日";
37
38 public final static String STYLE_9 = "hhmmss";
39
40 public final static String STYLE_10 = "yyyyMMddHHmmss";
41
42 //ISO8601格式时间 例如2019-12-17T10:34:00+0800
43 public final static String STYLE_11="yyyy-MM-dd'T'HH:mm:ssZZ";
44
45 //ISO8601格式时间 例如2019-12-17T10:34:00+08:00
46 public final static String STYLE_12="yyyy-MM-dd'T'HH:mm:ssXXX";
47
48 private static Map<String, SimpleDateFormat> sdfMap=new HashMap<String, SimpleDateFormat>();
49
50 static{
51 sdfMap.put(STYLE_1, new SimpleDateFormat(STYLE_1));
52 sdfMap.put(STYLE_2, new SimpleDateFormat(STYLE_2));
53 sdfMap.put(STYLE_3, new SimpleDateFormat(STYLE_3));
54 sdfMap.put(STYLE_4, new SimpleDateFormat(STYLE_4));
55 sdfMap.put(STYLE_5, new SimpleDateFormat(STYLE_5));
56 sdfMap.put(STYLE_6, new SimpleDateFormat(STYLE_6));
57 sdfMap.put(STYLE_7, new SimpleDateFormat(STYLE_7));
58 sdfMap.put(STYLE_8, new SimpleDateFormat(STYLE_8));
59 sdfMap.put(STYLE_9, new SimpleDateFormat(STYLE_9));
60 sdfMap.put(STYLE_10, new SimpleDateFormat(STYLE_10));
61 }
62
63 public static String getCurrentTime() {
64 return sdfMap.get(STYLE_5).format(new Date());
65 }
66
67 /**
68 *获取当前时间字符串yyyyMMddhhmmss
69 */
70 public static String getNowString() {
71 return sdfMap.get(STYLE_10).format(new Date());
72 }
73 public static String getCurrentTime(String str) {
74 return sdfMap.get(str).format(new Date());
75 }
76
77 public static String getCurrentTime(String str,String date) {
78 return sdfMap.get(str).format(strConvertToDate(date));
79 }
80
81 /**
82 * 获取当前时间
83 * 方法描述
84 * @return
85 */
86 public static String getNowDate(){
87 return sdf.format(new Date());
88 }
89
90 /**
91 * 字符串类型转化为日期类型
92 * @param str
93 * @return
94 */
95 public static Date strConvertToDate(String str){
96 if(StringUtils.isNotEmpty(str)){
97 try {
98 return sdf.parse(str);
99 } catch (ParseException e) {
100 // TODO Auto-generated catch block
101 e.printStackTrace();
102 }
103 }
104 return null;
105 }
106
107 /**
108 * 日期类型转化为制定的日期格式
109 * @param date
110 * @return
111 */
112 public static Date dateConvertToDate(Date date){
113 String str= sdf.format(date);
114 try {
115 return sdf.parse(str);
116 } catch (ParseException e) {
117 // TODO Auto-generated catch block
118 e.printStackTrace();
119 }
120 return date;
121 }
122 /**
123 * 比较时间大小
124 *
125 * @param beginDate 开始时间
126 * @param endDate 结束时间
127 * @return true begin大于end
128 */
129 public static boolean datecompare(Date beginDate,Date endDate){
130 try{
131 if(beginDate==null || endDate==null){
132 return false;
133 }
134 if(beginDate.getTime()>=endDate.getTime()){
135 return true;
136 }
137
138 }catch(Exception e){
139 e.printStackTrace();
140 }
141 return false;
142 }
143 /**
144 * 判断number是不是在两者之间
145 * @author wu.yy
146 *
147 * @param number
148 * @param start
149 * @param end
150 * @return
151 */
152 public static boolean during(int number,int start,int end){
153 if(number>=start && number<end){
154 return true;
155 }
156 return false;
157 }
158 /**
159 * 根据不同的类别获取相应的统计格式
160 * @param lb 类别 kk_day 天 kk_month月 kk_jd季度 kk_year年kk_kk 卡口
161 * @param code 类别相应的编码值
162 * @param beginDate 开始时间
163 * @param endDate 结束时间
164 * @return map对象
165 */
166 public static Map<String, Object> getTimeByLb(String lb,String code,String beginDate,String endDate){
167 Map<String, Object> map = new HashMap<String, Object>();
168 if(StringUtils.isBlank(lb)){
169 map.put("code", "to_char(t.pass_time,'yyyy-mm-dd')");
170 map.put("beginDate", "trunc(sysdate-7)");
171 map.put("endDate", "trunc(sysdate-1)");
172 }else if("kk_day".equalsIgnoreCase(lb)){
173 map.put("code", "to_char(t.pass_time,'yyyy-mm-dd')");
174 if("0".equalsIgnoreCase(code)){
175 map.put("beginDate", "trunc(sysdate-7)");
176 map.put("endDate", "trunc(sysdate-1)");
177 }else if("1".equalsIgnoreCase(code)){
178 map.put("beginDate", "trunc(add_months(sysdate,-1))");
179 map.put("endDate", "trunc(sysdate-1)");
180 }else if("2".equalsIgnoreCase(code)){
181 if(StringUtils.isNotBlank(beginDate)){
182 map.put("beginDate","to_date('"+beginDate+"','yyyy-mm-dd')");
183 }
184 if(StringUtils.isNotBlank(endDate)){
185 map.put("endDate", "to_date('"+endDate+"','yyyy-mm-dd')");
186 }
187 }
188 return map;
189 }else if("kk_month".equalsIgnoreCase(lb)){
190 map.put("code", "to_char(t.pass_time,'yyyy-mm')");
191 if("0".equalsIgnoreCase(code)){
192 map.put("beginDate", "trunc(add_months(sysdate,-3))");
193 map.put("endDate", "trunc(sysdate-1)");
194 }else if("1".equalsIgnoreCase(code)){
195 map.put("beginDate", "trunc(add_months(sysdate,-6))");
196 map.put("endDate", "trunc(sysdate-1)");
197 }else if("2".equalsIgnoreCase(code)){
198 map.put("beginDate", "trunc(add_months(sysdate,-12))");
199 map.put("endDate", "trunc(sysdate-1)");
200 }else if("3".equalsIgnoreCase(code)){
201 if(StringUtils.isNotBlank(beginDate)){
202 map.put("beginDate","to_date('"+beginDate+"-01-01','yyyy-mm-dd')");
203 map.put("endDate", "to_date('"+beginDate+"-12-31','yyyy-mm-dd')");
204 }
205 }
206 return map;
207 }else if("kk_jd".equalsIgnoreCase(lb)){
208 map.put("code", "to_char(t.pass_time,'Q')");
209 map.put("bswq", beginDate);
210 if("0".equalsIgnoreCase(code)){
211 if(StringUtils.isNotBlank(beginDate)){
212 map.put("beginDate","to_date('"+beginDate+"-01-01','yyyy-mm-dd')");
213 map.put("endDate", "to_date('"+beginDate+"-12-31','yyyy-mm-dd')");
214 }
215 }
216 return map;
217 }else if("kk_year".equalsIgnoreCase(lb)){
218 map.put("code", "to_char(t.pass_time,'yyyy')");
219 map.put("bswy", beginDate);
220 if("0".equalsIgnoreCase(code)){
221 if(StringUtils.isNotBlank(beginDate)){
222 map.put("beginDate","to_date('"+beginDate+"-01-01','yyyy-mm-dd')");
223 }
224 if(StringUtils.isNotBlank(endDate)){
225 map.put("endDate", "to_date('"+endDate+"-12-31','yyyy-mm-dd')");
226 }
227 }
228 return map;
229 }else if("kk_kk".equalsIgnoreCase(lb)){
230 map.put("code", "pass_port_name");
231 if("0".equalsIgnoreCase(code)){
232 map.put("beginDate", "trunc(sysdate-7)");
233 map.put("endDate", "trunc(sysdate-1)");
234 }else if("1".equalsIgnoreCase(code)){
235 map.put("beginDate", "trunc(add_months(sysdate,-1))");
236 map.put("endDate", "trunc(sysdate-1)");
237 }else if("2".equalsIgnoreCase(code)){
238 map.put("beginDate", "trunc(add_months(sysdate,-3))");
239 map.put("endDate", "trunc(sysdate-1)");
240 }else if("3".equalsIgnoreCase(code)){
241 map.put("beginDate", "trunc(add_months(sysdate,-6))");
242 map.put("endDate", "trunc(sysdate-1)");
243 }else if("4".equalsIgnoreCase(code)){
244 map.put("beginDate", "trunc(add_months(sysdate,-12))");
245 map.put("endDate", "trunc(sysdate-1)");
246 }else if("5".equalsIgnoreCase(code)){
247 if(StringUtils.isNotBlank(beginDate)){
248 map.put("beginDate","to_date('"+beginDate+"-01-01','yyyy-mm-dd')");
249 }
250 if(StringUtils.isNotBlank(endDate)){
251 map.put("endDate", "to_date('"+endDate+"-12-31','yyyy-mm-dd')");
252 }
253 }else if("6".equalsIgnoreCase(code)){
254 map.put("beginDate","to_date('"+beginDate+"-"+((Integer.parseInt(endDate)-1)*3+1)+"-01','yyyy-mm-dd')");
255 map.put("endDate", "to_date('"+beginDate+"-"+(Integer.parseInt(endDate)*3)+"-"+getDayByMonth(String.valueOf(Integer.parseInt(endDate)*3))+"','yyyy-mm-dd')");
256 }else if("7".equalsIgnoreCase(code)){
257 map.put("beginDate","to_date('"+beginDate+"-"+endDate+"-01','yyyy-mm-dd')");
258 map.put("endDate", "to_date('"+beginDate+"-"+endDate+"-"+getDayByMonth(endDate)+"','yyyy-mm-dd')");
259 }else if("8".equalsIgnoreCase(code)){
260 if(StringUtils.isNotBlank(beginDate)){
261 map.put("beginDate","to_date('"+beginDate+"','yyyy-mm-dd')");
262 }
263 if(StringUtils.isNotBlank(endDate)){
264 map.put("endDate", "to_date('"+endDate+"','yyyy-mm-dd')");
265 }
266 }
267 return map;
268 }
269 return map;
270 }
271 /**
272 * 根据当前月份获取该月最后一天日期
273 * @param month 月份
274 * @return 该月最后一天日期
275 */
276 private static String getDayByMonth(String month){
277 if("2".equalsIgnoreCase(month)){
278 return "28";
279 }else if("1".equalsIgnoreCase(month) || "3".equalsIgnoreCase(month) || "5".equalsIgnoreCase(month) || "7".equalsIgnoreCase(month) || "8".equalsIgnoreCase(month) || "10".equalsIgnoreCase(month) || "12".equalsIgnoreCase(month)){
280 return "31";
281 }else{
282 return "30";
283 }
284 }
285
286 /**
287 * 获取当前日期前一天
288 * @return date
289 */
290 public static Date getLastDay(){
291 Calendar calendar = Calendar.getInstance();
292 calendar.add(Calendar.DATE, -1); //得到前一天
293 Date date = calendar.getTime();
294 return date;
295 }
296
297 /**
298 * 获取当前日期前两天
299 * @return date
300 */
301 public static Date getLastTwoDay(){
302 Calendar calendar = Calendar.getInstance();
303 calendar.add(Calendar.DATE, -2); //得到前一天
304 Date date = calendar.getTime();
305 return date;
306 }
307
308
309 /**
310 * 获取当前日期前n天
311 * @return date
312 */
313 public static Date getLast(int day){
314 Calendar calendar = Calendar.getInstance();
315 calendar.add(Calendar.DATE, -day); //得到前一天
316 Date date = calendar.getTime();
317 return date;
318 }
319
320 /**
321 * 获取当前日期后n天
322 * @return date
323 */
324 public static Date getLastDay(Date date1 ,int days){
325 Calendar calendar = Calendar.getInstance();
326 calendar.setTime(date1);
327 calendar.add(Calendar.DATE, -days); //得到前一天
328 Date date = calendar.getTime();
329 return date;
330 }
331
332 /**
333 * 格式化日期
334 * @param format
335 * @return
336 */
337 public static String formatDate(String format){
338 SimpleDateFormat sFormat = new SimpleDateFormat(format);
339 return sFormat.format(new Date());
340 }
341
342 /**
343 * 格式化日期
344 * @param format
345 * @return
346 */
347 public static String formatDate(Date date,String format){
348 SimpleDateFormat sFormat = new SimpleDateFormat(format);
349 return sFormat.format(date);
350 }
351 /**
352 * 时间格式化为:yyyyMMddHHmmss
353 * @param date
354 * @return 返回已格式化的字符串
355 */
356 public static String getDateString(Date date){
357 SimpleDateFormat s = new SimpleDateFormat("yyyyMMddHHmmss");
358 return s.format(date);
359 }
360 /**
361 * 判断验证码是否失效
362 * @param date1 : 数据库中的时间
363 * @param code:数据字典中的子健code
364 * @return false 失效 true 未失效
365 * @throws HsException
366 */
367 public static Boolean isDateBig(String date1,String errortime) throws Exception{
368 SimpleDateFormat s = new SimpleDateFormat("yyyyMMddHHmmss");
369 Date date = s.parse(date1);//将已格式化的时间字符串转成时间格式
370 long dataBaseTame = date.getTime();//将具体时间转成毫秒数
371 //将修改时间加上数据字典中配置的参数
372 long secon = Integer.parseInt(errortime)*1000 + dataBaseTame;
373 Date nowDate = new Date();//获取当前时间
374 long nowDateTime = nowDate.getTime();//将具体时间转成毫秒数
375 if(secon < nowDateTime){ //判断验证码是否已失效
376 return false;
377 }
378 return true;
379 }
380 /**
381 * 将yyyy年MM月dd天格式的时间字符串转为yyyymmdd格式
382 * @param date
383 * @return 返回已格式化的字符串
384 * @throws HsException
385 */
386 public static String changeDate(String str) throws Exception{
387 SimpleDateFormat s = new SimpleDateFormat("yyyy年MM月dd日");
388 Date date = s.parse(str);
389 return getDateString(date);
390 }
391 /**
392 * 将yyyy年MM月dd天格式的时间字符串转为yyyymmdd格式
393 * @param date
394 * @return 返回已格式化的字符串
395 * @throws HsException
396 */
397 public static String changeDates(String str) throws Exception{
398 SimpleDateFormat s = new SimpleDateFormat("yyyyMMdd");
399 SimpleDateFormat s1 = new SimpleDateFormat("yyyy年MM月dd日 ");
400 str = str.substring(0, 8);
401 Date date = s.parse(str);
402 return s1.format(date);
403 }
404
405 /**
406 * 将yyyy-MM-dd HH:mm:ss 时间格式转换为 yyyyMMddHHmmss格式
407 * @param str 时间格式字符串,格式为yyyy-MM-dd HH:mm:ss
408 * @return
409 * @throws Exception
410 */
411 public static String changeDatesString(String str) throws Exception{
412 SimpleDateFormat sdfStyle1 = sdfMap.get(STYLE_1);
413 SimpleDateFormat sdfStyle10 = sdfMap.get(STYLE_10);
414 return sdfStyle10.format(sdfStyle1.parse(str));
415
416 }
417 /**
418 * 判断用户输入密码错误不能登录时间是否已过
419 * @param date1 : 数据库中用户密码输入错误时间
420 * @param code:数据字典中的子健code
421 * @return false 锁定时间内 true 锁定时间外
422 * @throws HsException
423 */
424 public static Boolean isErrorTime(String date1,String code,String limtime) throws Exception{
425 SimpleDateFormat s = new SimpleDateFormat("yyyyMMddHHmmss");
426 Date date = s.parse(date1);//将已格式化的时间字符串转成时间格式
427 long dataBaseTame = date.getTime();//将具体时间转成毫秒数
428 //将修改时间加上数据字典中配置的参数
429 long secon = Integer.parseInt(limtime)*1000 + dataBaseTame;
430 Date nowDate = new Date();//获取当前时间
431 long nowDateTime = nowDate.getTime();//将具体时间转成毫秒数
432 if(secon > nowDateTime){ //判断用户是否在锁定时间内
433 return false;
434 }
435 return true;
436 }
437
438
439 /**
440 * 获取当前日期前两天
441 * @return date
442 */
443 public static Date getLastMouth(Date date1 ,int mouth){
444 Calendar calendar = Calendar.getInstance();
445 calendar.setTime(date1);
446 calendar.add(Calendar.MONTH, mouth); //得到前一天
447 Date date = calendar.getTime();
448 return date;
449 }
450
451 /**
452 * 字符串类型转化为日期类型
453 * @param str
454 * @return
455 */
456 public static Date strConvertToDate2(String str1,String str){
457 if(StringUtils.isNotEmpty(str)){
458 try {
459 return sdfMap.get(str1).parse(str);
460 } catch (ParseException e) {
461 // TODO Auto-generated catch block
462 e.printStackTrace();
463 }
464 }
465 return null;
466 }
467
468 /**
469 * 将时间戳转换成时间格式
470 * example:1499137275926 to 20170704110115
471 * @param timeStamp
472 * @return
473 */
474 public static String timestampToDateStr(long timeStamp){
475 SimpleDateFormat sdf = sdfMap.get(STYLE_10);
476 Date date = new Date(timeStamp);
477 return sdf.format(date);
478 }
479
480 /**
481 * 将 yyyyMMddHHmmss 时间格式转换为yyyy-MM-dd HH:mm:ss格式
482 * @param str 时间格式字符串,格式为yyyyMMddHHmmss
483 * @return
484 * @throws Exception
485 */
486 public static String dateFormat(String str) throws Exception{
487 SimpleDateFormat sdfStyle1 = sdfMap.get(STYLE_1);
488 SimpleDateFormat sdfStyle10 = sdfMap.get(STYLE_10);
489 return sdfStyle1.format(sdfStyle10.parse(str));
490 }
491
492 /**
493 * 日期增加月份部分
494 *
495 * @param date
496 * @param amount
497 * @return
498 */
499 public static Date addMonth(Date date, int amount) {
500 return add(date, Calendar.MONTH, amount);
501 }
502
503 /**
504 * 日期增加分钟部分
505 *
506 * @param date
507 * @param amount
508 * @return
509 */
510 public static Date addMiunte(Date date, int amount) {
511 return add(date, Calendar.MINUTE, amount);
512 }
513
514 public static Date add(Date date, int field, int amount) {
515 if (date == null) {
516 date = new Date();
517 }
518
519 Calendar cal = Calendar.getInstance();
520 cal.setTime(date);
521 cal.add(field, amount);
522
523 return cal.getTime();
524 }
525
526
527 /**
528 * 判断当前时间是否在[startTime, endTime]区间,注意时间格式要一致
529 *
530 * @param nowTime
531 * 当前时间
532 * @param startTime
533 * 开始时间
534 * @param endTime
535 * 结束时间
536 * @return
537 */
538 public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
539 if (nowTime.getTime() == startTime.getTime() || nowTime.getTime() == endTime.getTime()) {
540 return true;
541 }
542
543 Calendar date = Calendar.getInstance();
544 date.setTime(nowTime);
545
546 Calendar begin = Calendar.getInstance();
547 begin.setTime(startTime);
548
549 Calendar end = Calendar.getInstance();
550 end.setTime(endTime);
551
552 if (date.after(begin) && date.before(end)) {
553 return true;
554 } else {
555 return false;
556 }
557 }
558
559 /**
560 * 返回两个日期的相隔天数
561 * @param startDate
562 * @param endDate
563 * @return
564 */
565 public static Long getDaysBetween(Date startDate, Date endDate) {
566 Calendar fromCalendar = Calendar.getInstance();
567 fromCalendar.setTime(startDate);
568 fromCalendar.set(Calendar.HOUR_OF_DAY, 0);
569 fromCalendar.set(Calendar.MINUTE, 0);
570 fromCalendar.set(Calendar.SECOND, 0);
571 fromCalendar.set(Calendar.MILLISECOND, 0);
572
573 Calendar toCalendar = Calendar.getInstance();
574 toCalendar.setTime(endDate);
575 toCalendar.set(Calendar.HOUR_OF_DAY, 0);
576 toCalendar.set(Calendar.MINUTE, 0);
577 toCalendar.set(Calendar.SECOND, 0);
578 toCalendar.set(Calendar.MILLISECOND, 0);
579
580 return (toCalendar.getTime().getTime() - fromCalendar.getTime().getTime()) / (1000 * 60 * 60 * 24);
581 }
582
583
584 /**
585 * 获取某月的最后一天
586 *
587 */
588 public static Date getLastDayOfMonth(int year,int month)
589 {
590 Calendar cal = Calendar.getInstance();
591 //设置年份
592 cal.set(Calendar.YEAR,year);
593 //设置月份
594 cal.set(Calendar.MONTH, month-1);
595 //获取某月最大天数
596 int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
597 //设置日历中月份的最大天数
598 cal.set(Calendar.DAY_OF_MONTH, lastDay);
599 return cal.getTime();
600 }
601 }