1 package com.zhouyy.netBank.util;
2
3 import org.springframework.util.StringUtils;
4
5 import java.beans.PropertyEditorSupport;
6 import java.sql.Timestamp;
7 import java.text.DateFormat;
8 import java.text.ParseException;
9 import java.text.SimpleDateFormat;
10 import java.util.*;
11
12 /**
13 * 类描述:时间操作定义类
14 *
15 */
16 public class DateUtils extends PropertyEditorSupport {
17 // 各种时间格式
18 public static final SimpleDateFormat date_sdf = new SimpleDateFormat("yyyy-MM-dd");
19 // 各种时间格式
20 public static final SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
21 // 各种时间格式
22 public static final SimpleDateFormat date_sdf_wz = new SimpleDateFormat("yyyy年MM月dd日");
23 public static final SimpleDateFormat time_sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
24 public static final SimpleDateFormat yyyymmddhhmmss = new SimpleDateFormat("yyyyMMddHHmmss");
25 public static final SimpleDateFormat short_time_sdf = new SimpleDateFormat("HH:mm");
26 public static final SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
27 // 以毫秒表示的时间
28 private static final long DAY_IN_MILLIS = 24 * 3600 * 1000;
29 private static final long HOUR_IN_MILLIS = 3600 * 1000;
30 private static final long MINUTE_IN_MILLIS = 60 * 1000;
31 private static final long SECOND_IN_MILLIS = 1000;
32
33 // Grace style
34 // public static final String PATTERN_GRACE = "yyyy/MM/dd HH:mm:ss";
35 // public static final String PATTERN_GRACE_NORMAL = "yyyy/MM/dd HH:mm";
36 // public static final String PATTERN_GRACE_SIMPLE = "yyyy/MM/dd";
37
38 // Classical style
39 public static final String PATTERN_CLASSICAL = "yyyy-MM-dd HH:mm:ss";
40 public static final String PATTERN_CLASSICAL_NORMAL = "yyyy-MM-dd HH:mm";
41 public static final String PATTERN_CLASSICAL_SIMPLE = "yyyy-MM-dd";
42
43 //CH style
44 public static final String PATTERN_CH = "yyyy年MM月dd日 HH时mm分ss秒";
45 public static final String PATTERN_CH_NORMAL = "yyyy年MM月dd日 HH时mm分";
46 public static final String PATTERN_CH_SIMPLE = "yyyy年MM月dd日";
47
48 // 指定模式的时间格式
49 private static SimpleDateFormat getSDFormat(String pattern) {
50 return new SimpleDateFormat(pattern);
51 }
52
53 /**
54 * 当前日历,这里用中国时间表示
55 *
56 * @return 以当地时区表示的系统当前日历
57 */
58 public static Calendar getCalendar() {
59 return Calendar.getInstance();
60 }
61
62 /**
63 * 指定毫秒数表示的日历
64 *
65 * @param millis 毫秒数
66 * @return 指定毫秒数表示的日历
67 */
68 public static Calendar getCalendar(long millis) {
69 Calendar cal = Calendar.getInstance();
70 cal.setTime(new Date(millis));
71 return cal;
72 }
73
74 // ////////////////////////////////////////////////////////////////////////////
75 // getDate
76 // 各种方式获取的Date
77 // ////////////////////////////////////////////////////////////////////////////
78
79 /**
80 * 当前日期
81 *
82 * @return 系统当前时间
83 */
84 public static Date getDate() {
85 return new Date();
86 }
87
88 /**
89 * 当前日期 不带时分秒
90 *
91 * @return 系统当前时间
92 */
93 public static Date getDateYMD() {
94 return DateUtils.str2Date(DateUtils.date2Str(DateUtils.yyyyMMdd), DateUtils.yyyyMMdd);
95 }
96
97 /**
98 * 获取日期 不带时分秒
99 *
100 * @return 系统当前时间
101 */
102 public static Date getDateYMD(Date date) {
103 return DateUtils.str2Date(DateUtils.date2Str(date, DateUtils.yyyyMMdd), DateUtils.yyyyMMdd);
104 }
105
106 /**
107 * 指定毫秒数表示的日期
108 *
109 * @param millis 毫秒数
110 * @return 指定毫秒数表示的日期
111 */
112 public static Date getDate(long millis) {
113 return new Date(millis);
114 }
115
116 /**
117 * 时间戳转换为字符串
118 *
119 * @param time
120 * @return
121 */
122 public static String timestamptoStr(Timestamp time) {
123 Date date = null;
124 if (null != time) {
125 date = new Date(time.getTime());
126 }
127 return date2Str(date_sdf);
128 }
129
130 /**
131 * 字符串转换时间戳
132 *
133 * @param str
134 * @return
135 */
136 public static Timestamp str2Timestamp(String str) {
137 Date date = str2Date(str, date_sdf);
138 return new Timestamp(date.getTime());
139 }
140
141 /**
142 * 字符串转换成日期
143 *
144 * @param str
145 * @param sdf
146 * @return
147 */
148 public static Date str2Date(String str, SimpleDateFormat sdf) {
149 if (null == str || "".equals(str)) {
150 return null;
151 }
152 Date date = null;
153 try {
154 date = sdf.parse(str);
155 return date;
156 } catch (ParseException e) {
157 e.printStackTrace();
158 }
159 return null;
160 }
161
162 /**
163 * 日期转换为字符串
164 *
165 * @param date 日期
166 * @param format 日期格式
167 * @return 字符串
168 */
169 public static String date2Str(SimpleDateFormat date_sdf) {
170 Date date = getDate();
171 if (null == date) {
172 return null;
173 }
174 return date_sdf.format(date);
175 }
176
177 /**
178 * 格式化时间
179 *
180 * @param date
181 * @param format
182 * @return
183 */
184 public static String dateformat(String date, String format) {
185 SimpleDateFormat sformat = new SimpleDateFormat(format);
186 Date _date = null;
187 try {
188 _date = sformat.parse(date);
189 } catch (ParseException e) {
190 // TODO Auto-generated catch block
191 e.printStackTrace();
192 }
193 return sformat.format(_date);
194 }
195
196 /**
197 * 日期转换为字符串
198 *
199 * @param date 日期
200 * @param format 日期格式
201 * @return 字符串
202 */
203 public static String date2StrCNY(Date date) {
204 if (null == date) {
205 return null;
206 }
207 return date2Str(date,date_sdf_wz);
208 }
209
210 /**
211 * 日期转换为字符串
212 *
213 * @param date 日期
214 * @param format 日期格式
215 * @return 字符串
216 */
217 public static String date2Str(Date date, SimpleDateFormat date_sdf) {
218 if (null == date) {
219 return null;
220 }
221 return date_sdf.format(date);
222 }
223
224 /**
225 * 日期转换为字符串
226 *
227 * @param date 日期
228 * @param format 日期格式
229 * @return 字符串
230 */
231 public static String getDate(String format) {
232 Date date = new Date();
233 if (null == date) {
234 return null;
235 }
236 SimpleDateFormat sdf = new SimpleDateFormat(format);
237 return sdf.format(date);
238 }
239
240 /**
241 * 指定毫秒数的时间戳
242 *
243 * @param millis 毫秒数
244 * @return 指定毫秒数的时间戳
245 */
246 public static Timestamp getTimestamp(long millis) {
247 return new Timestamp(millis);
248 }
249
250 /**
251 * 以字符形式表示的时间戳
252 *
253 * @param time 毫秒数
254 * @return 以字符形式表示的时间戳
255 */
256 public static Timestamp getTimestamp(String time) {
257 return new Timestamp(Long.parseLong(time));
258 }
259
260 /**
261 * 系统当前的时间戳
262 *
263 * @return 系统当前的时间戳
264 */
265 public static Timestamp getTimestamp() {
266 return new Timestamp(new Date().getTime());
267 }
268
269 /**
270 * 指定日期的时间戳
271 *
272 * @param date 指定日期
273 * @return 指定日期的时间戳
274 */
275 public static Timestamp getTimestamp(Date date) {
276 return new Timestamp(date.getTime());
277 }
278
279 /**
280 * 指定日历的时间戳
281 *
282 * @param cal 指定日历
283 * @return 指定日历的时间戳
284 */
285 public static Timestamp getCalendarTimestamp(Calendar cal) {
286 return new Timestamp(cal.getTime().getTime());
287 }
288
289 public static Timestamp gettimestamp() {
290 Date dt = new Date();
291 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
292 String nowTime = df.format(dt);
293 java.sql.Timestamp buydate = java.sql.Timestamp.valueOf(nowTime);
294 return buydate;
295 }
296
297 // ////////////////////////////////////////////////////////////////////////////
298 // getMillis
299 // 各种方式获取的Millis
300 // ////////////////////////////////////////////////////////////////////////////
301
302 /**
303 * 系统时间的毫秒数
304 *
305 * @return 系统时间的毫秒数
306 */
307 public static long getMillis() {
308 return new Date().getTime();
309 }
310
311 /**
312 * 指定日历的毫秒数
313 *
314 * @param cal 指定日历
315 * @return 指定日历的毫秒数
316 */
317 public static long getMillis(Calendar cal) {
318 return cal.getTime().getTime();
319 }
320
321 /**
322 * 指定日期的毫秒数
323 *
324 * @param date 指定日期
325 * @return 指定日期的毫秒数
326 */
327 public static long getMillis(Date date) {
328 return date.getTime();
329 }
330
331 /**
332 * 指定时间戳的毫秒数
333 *
334 * @param ts 指定时间戳
335 * @return 指定时间戳的毫秒数
336 */
337 public static long getMillis(Timestamp ts) {
338 return ts.getTime();
339 }
340
341 // ////////////////////////////////////////////////////////////////////////////
342 // formatDate
343 // 将日期按照一定的格式转化为字符串
344 // ////////////////////////////////////////////////////////////////////////////
345
346 /**
347 * 默认方式表示的系统当前日期,具体格式:年-月-日
348 *
349 * @return 默认日期按“年-月-日“格式显示
350 */
351 public static String formatDate() {
352 return date_sdf.format(getCalendar().getTime());
353 }
354
355 /**
356 * 默认方式表示的系统当前日期,具体格式:yyyy-MM-dd HH:mm:ss
357 *
358 * @return 默认日期按“yyyy-MM-dd HH:mm:ss“格式显示
359 */
360 public static String formatDateTime() {
361 return datetimeFormat.format(getCalendar().getTime());
362 }
363
364 /**
365 * 获取时间字符串
366 */
367 public static String getDataString(SimpleDateFormat formatstr) {
368 return formatstr.format(getCalendar().getTime());
369 }
370
371 /**
372 * 指定日期的默认显示,具体格式:年-月-日
373 *
374 * @param cal 指定的日期
375 * @return 指定日期按“年-月-日“格式显示
376 */
377 public static String formatDate(Calendar cal) {
378 return date_sdf.format(cal.getTime());
379 }
380
381 /**
382 * 指定日期的默认显示,具体格式:年-月-日
383 *
384 * @param date 指定的日期
385 * @return 指定日期按“年-月-日“格式显示
386 */
387 public static String formatDate(Date date) {
388 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
389 return sdf.format(date);
390 }
391
392 /**
393 * 指定毫秒数表示日期的默认显示,具体格式:年-月-日
394 *
395 * @param millis 指定的毫秒数
396 * @return 指定毫秒数表示日期按“年-月-日“格式显示
397 */
398 public static String formatDate(long millis) {
399 return date_sdf.format(new Date(millis));
400 }
401
402 /**
403 * 默认日期按指定格式显示
404 *
405 * @param pattern 指定的格式
406 * @return 默认日期按指定格式显示
407 */
408 public static String formatDate(String pattern) {
409 return getSDFormat(pattern).format(getCalendar().getTime());
410 }
411
412 /**
413 * 指定日期按指定格式显示
414 *
415 * @param cal 指定的日期
416 * @param pattern 指定的格式
417 * @return 指定日期按指定格式显示
418 */
419 public static String formatDate(Calendar cal, String pattern) {
420 return getSDFormat(pattern).format(cal.getTime());
421 }
422
423 /**
424 * 指定日期按指定格式显示
425 *
426 * @param date 指定的日期
427 * @param pattern 指定的格式
428 * @return 指定日期按指定格式显示
429 */
430 public static String formatDate(Date date, String pattern) {
431 return getSDFormat(pattern).format(date);
432 }
433
434 // ////////////////////////////////////////////////////////////////////////////
435 // formatTime
436 // 将日期按照一定的格式转化为字符串
437 // ////////////////////////////////////////////////////////////////////////////
438
439 /**
440 * 默认方式表示的系统当前日期,具体格式:年-月-日 时:分
441 *
442 * @return 默认日期按“年-月-日 时:分“格式显示
443 */
444 public static String formatTime() {
445 return time_sdf.format(getCalendar().getTime());
446 }
447
448 /**
449 * 指定毫秒数表示日期的默认显示,具体格式:年-月-日 时:分
450 *
451 * @param millis 指定的毫秒数
452 * @return 指定毫秒数表示日期按“年-月-日 时:分“格式显示
453 */
454 public static String formatTime(long millis) {
455 return time_sdf.format(new Date(millis));
456 }
457
458 /**
459 * 指定日期的默认显示,具体格式:年-月-日 时:分
460 *
461 * @param cal 指定的日期
462 * @return 指定日期按“年-月-日 时:分“格式显示
463 */
464 public static String formatTime(Calendar cal) {
465 return time_sdf.format(cal.getTime());
466 }
467
468 /**
469 * 指定日期的默认显示,具体格式:年-月-日 时:分
470 *
471 * @param date 指定的日期
472 * @return 指定日期按“年-月-日 时:分“格式显示
473 */
474 public static String formatTime(Date date) {
475 return time_sdf.format(date);
476 }
477
478 // ////////////////////////////////////////////////////////////////////////////
479 // formatShortTime
480 // 将日期按照一定的格式转化为字符串
481 // ////////////////////////////////////////////////////////////////////////////
482
483 /**
484 * 默认方式表示的系统当前日期,具体格式:时:分
485 *
486 * @return 默认日期按“时:分“格式显示
487 */
488 public static String formatShortTime() {
489 return short_time_sdf.format(getCalendar().getTime());
490 }
491
492 /**
493 * 指定毫秒数表示日期的默认显示,具体格式:时:分
494 *
495 * @param millis 指定的毫秒数
496 * @return 指定毫秒数表示日期按“时:分“格式显示
497 */
498 public static String formatShortTime(long millis) {
499 return short_time_sdf.format(new Date(millis));
500 }
501
502 /**
503 * 指定日期的默认显示,具体格式:时:分
504 *
505 * @param cal 指定的日期
506 * @return 指定日期按“时:分“格式显示
507 */
508 public static String formatShortTime(Calendar cal) {
509 return short_time_sdf.format(cal.getTime());
510 }
511
512 /**
513 * 指定日期的默认显示,具体格式:时:分
514 *
515 * @param date 指定的日期
516 * @return 指定日期按“时:分“格式显示
517 */
518 public static String formatShortTime(Date date) {
519 return short_time_sdf.format(date);
520 }
521
522 // ////////////////////////////////////////////////////////////////////////////
523 // parseDate
524 // parseCalendar
525 // parseTimestamp
526 // 将字符串按照一定的格式转化为日期或时间
527 // ////////////////////////////////////////////////////////////////////////////
528
529 /**
530 * 根据指定的格式将字符串转换成Date 如输入:2003-11-19 11:20:20将按照这个转成时间
531 *
532 * @param src 将要转换的原始字符窜
533 * @param pattern 转换的匹配格式
534 * @return 如果转换成功则返回转换后的日期
535 * @throws ParseException
536 * @throws AIDateFormatException
537 */
538 public static Date parseDate(String src, String pattern)
539 throws ParseException {
540 return getSDFormat(pattern).parse(src);
541
542 }
543
544 /**
545 * 根据指定的格式将字符串转换成Date 如输入:2003-11-19 11:20:20将按照这个转成时间
546 *
547 * @param src 将要转换的原始字符窜
548 * @param pattern 转换的匹配格式
549 * @return 如果转换成功则返回转换后的日期
550 * @throws ParseException
551 * @throws AIDateFormatException
552 */
553 public static Calendar parseCalendar(String src, String pattern)
554 throws ParseException {
555
556 Date date = parseDate(src, pattern);
557 Calendar cal = Calendar.getInstance();
558 cal.setTime(date);
559 return cal;
560 }
561
562 public static String formatAddDate(String src, String pattern, int amount)
563 throws ParseException {
564 Calendar cal;
565 cal = parseCalendar(src, pattern);
566 cal.add(Calendar.DATE, amount);
567 return formatDate(cal);
568 }
569
570 /**
571 * 根据指定的格式将字符串转换成Date 如输入:2003-11-19 11:20:20将按照这个转成时间
572 *
573 * @param src 将要转换的原始字符窜
574 * @param pattern 转换的匹配格式
575 * @return 如果转换成功则返回转换后的时间戳
576 * @throws ParseException
577 * @throws AIDateFormatException
578 */
579 public static Timestamp parseTimestamp(String src, String pattern)
580 throws ParseException {
581 Date date = parseDate(src, pattern);
582 return new Timestamp(date.getTime());
583 }
584
585 // ////////////////////////////////////////////////////////////////////////////
586 // dateDiff
587 // 计算两个日期之间的差值
588 // ////////////////////////////////////////////////////////////////////////////
589
590 /**
591 * 计算两个时间之间的差值,根据标志的不同而不同
592 *
593 * @param flag 计算标志,表示按照年/月/日/时/分/秒等计算
594 * @param calSrc 减数
595 * @param calDes 被减数
596 * @return 两个日期之间的差值
597 */
598 public static int dateDiff(char flag, Calendar calSrc, Calendar calDes) {
599
600 long millisDiff = getMillis(calSrc) - getMillis(calDes);
601
602 if (flag == 'y') {
603 return (calSrc.get(calSrc.YEAR) - calDes.get(calDes.YEAR));
604 }
605
606 if (flag == 'M') {
607 return (calSrc.get(calSrc.MONTH) +
608 ( (calSrc.get(calSrc.YEAR) - calDes.get(calDes.YEAR))*12 ) - calDes.get(calDes.MONTH));
609 }
610
611 if (flag == 'd') {
612 return (int) (millisDiff / DAY_IN_MILLIS);
613 }
614
615 if (flag == 'h') {
616 return (int) (millisDiff / HOUR_IN_MILLIS);
617 }
618
619 if (flag == 'm') {
620 return (int) (millisDiff / MINUTE_IN_MILLIS);
621 }
622
623 if (flag == 's') {
624 return (int) (millisDiff / SECOND_IN_MILLIS);
625 }
626
627 return 0;
628 }
629
630 /**
631 * String类型 转换为Date,
632 * 如果参数长度为10 转换格式”yyyy-MM-dd“
633 * 如果参数长度为19 转换格式”yyyy-MM-dd HH:mm:ss“
634 * * @param text
635 * String类型的时间值
636 */
637 public void setAsText(String text) throws IllegalArgumentException {
638 if (StringUtils.hasText(text)) {
639 try {
640 if (text.indexOf(":") == -1 && text.length() == 10) {
641 setValue(this.date_sdf.parse(text));
642 } else if (text.indexOf(":") > 0 && text.length() == 19) {
643 setValue(this.datetimeFormat.parse(text));
644 } else {
645 throw new IllegalArgumentException(
646 "Could not parse date, date format is error ");
647 }
648 } catch (ParseException ex) {
649 IllegalArgumentException iae = new IllegalArgumentException(
650 "Could not parse date: " + ex.getMessage());
651 iae.initCause(ex);
652 throw iae;
653 }
654 } else {
655 setValue(null);
656 }
657 }
658
659 public static int getYear() {
660 GregorianCalendar calendar = new GregorianCalendar();
661 calendar.setTime(getDate());
662 return calendar.get(Calendar.YEAR);
663 }
664
665 public static String getAfterMonth(int month, int day) {
666 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
667 GregorianCalendar calendar = new GregorianCalendar();
668 calendar.add(2, month);
669 calendar.add(5, day);
670 String date = format.format(calendar.getTime());
671 return date;
672 }
673
674 public static String getAfterDate(int day) {
675 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
676 GregorianCalendar calendar = new GregorianCalendar();
677 calendar.add(5, day);
678 String date = format.format(calendar.getTime());
679 return date;
680 }
681
682 public static String getAfterMinute(int minute) {
683 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
684 GregorianCalendar calendar = new GregorianCalendar();
685 calendar.add(12, minute);
686 String date = format.format(calendar.getTime());
687 return date;
688 }
689
690 public static String getAfterSecond(int second) {
691 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
692 GregorianCalendar calendar = new GregorianCalendar();
693 calendar.add(13, second);
694 String date = format.format(calendar.getTime());
695 return date;
696 }
697
698
699 public static String getDateStr(Date date, String Pattern) {
700 SimpleDateFormat formatter = new SimpleDateFormat(Pattern);
701 return formatter.format(date);
702 }
703
704
705 /**
706 * 日期的增加天数
707 *
708 * @param date 日期
709 * @param addDay 增加的天数,正数表示增加,负数表示减少
710 * @return Date 日期的增加月数后的结果
711 */
712 public static Date addDay(Date date, int addDay) {
713 Calendar calendar = Calendar.getInstance();
714 calendar.setTime(date);
715 calendar.add(Calendar.DAY_OF_MONTH, addDay);
716 return new Date(calendar.getTime().getTime());
717 }
718
719 /**
720 * 将datetime转换为date类型
721 *
722 * @param date
723 * @return
724 * @author zuoy 2017-09-15
725 */
726 public static Date parseDate(Date date){
727 return parse(DateUtils.date2Str(date, DateUtils.date_sdf), "yyyy-MM-dd");
728 }
729
730 /**
731 * 静态方法 根据两个日期求相差天数 正数表示d1大于d2天数 负数表示d1小于d2天数
732 * add 7.30
733 *
734 * @author zdl
735 */
736 public static int dayDiffs(Date d1, Date d2) {
737 if (d1 == null || d2 == null) {
738 return 0;
739 }
740 long tt = d1.getTime() - d2.getTime();
741 int days = (int) (tt / (24 * 60 * 60 * 1000));
742 return days;
743
744 }
745
746 /**
747 * 验证日期是否是周末
748 */
749 public static boolean checkHoliday(Date date) {
750 Calendar ca = Calendar.getInstance();
751 ca.setTime(date);
752 //判断日期是否是周六周日
753 if (ca.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY || ca.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
754 return true;
755 }
756 return false;
757 }
758
759 /**
760 * 验证日期是否是周末
761 */
762 public static int getDay(Date date) {
763 Calendar ca = Calendar.getInstance();
764 ca.setTime(date);
765 return ca.get(Calendar.DAY_OF_MONTH);
766 }
767
768 /***********2017年10月24日 byzhouyy新增以下代码***********/
769
770 /**
771 * 根据默认格式将指定字符串解析成日期
772 *
773 * @param str 指定字符串
774 * @return 返回解析后的日期
775 */
776 public static Date parse(String str) {
777 return parse(str, PATTERN_CLASSICAL);
778 }
779
780 /**
781 * 根据指定格式将指定字符串解析成日期
782 *
783 * @param str 指定日期
784 * @param pattern 指定格式
785 * @return 返回解析后的日期
786 */
787 public static Date parse(String str, String pattern) {
788 SimpleDateFormat sdf = new SimpleDateFormat(pattern);
789 try {
790 return sdf.parse(str);
791 } catch (Exception e) {
792 e.printStackTrace();
793 }
794 return null;
795 }
796
797 /**
798 * 根据默认格式将日期转格式化成字符串
799 *
800 * @param date 指定日期
801 * @return 返回格式化后的字符串
802 */
803 public static String format(Date date) {
804 return format(date, PATTERN_CLASSICAL);
805 }
806
807 /**
808 * 根据指定格式将指定日期格式化成字符串
809 *
810 * @param date 指定日期
811 * @param pattern 指定格式
812 * @return 返回格式化后的字符串
813 */
814 public static String format(Date date, String pattern) {
815 SimpleDateFormat sdf = new SimpleDateFormat(pattern);
816 return sdf.format(date);
817 }
818
819 /**
820 * 获取时间date1与date2相差的秒数
821 *
822 * @param date1 起始时间
823 * @param date2 结束时间
824 * @return 返回相差的秒数
825 */
826 public static int getOffsetSeconds(Date date1, Date date2) {
827 int seconds = (int) ((date2.getTime() - date1.getTime()) / 1000);
828 return seconds;
829 }
830
831 /**
832 * 获取时间date1与date2相差的分钟数
833 *
834 * @param date1 起始时间
835 * @param date2 结束时间
836 * @return 返回相差的分钟数
837 */
838 public static int getOffsetMinutes(Date date1, Date date2) {
839 return getOffsetSeconds(date1, date2) / 60;
840 }
841
842 /**
843 * 获取时间date1与date2相差的小时数
844 *
845 * @param date1 起始时间
846 * @param date2 结束时间
847 * @return 返回相差的小时数
848 */
849 public static int getOffsetHours(Date date1, Date date2) {
850 return getOffsetMinutes(date1, date2) / 60;
851 }
852
853 /**
854 * 获取时间date1与date2相差的天数数
855 *
856 * @param date1 起始时间
857 * @param date2 结束时间
858 * @return 返回相差的天数
859 */
860 public static int getOffsetDays(Date date1, Date date2) {
861 return getOffsetHours(date1, date2) / 24;
862 }
863
864 /**
865 * 获取时间date1与date2相差的周数
866 *
867 * @param date1 起始时间
868 * @param date2 结束时间
869 * @return 返回相差的周数
870 */
871 public static int getOffsetWeeks(Date date1, Date date2) {
872 return getOffsetDays(date1, date2) / 7;
873 }
874
875 /**
876 * 获取重置指定日期的时分秒后的时间
877 *
878 * @param date 指定日期
879 * @param hour 指定小时
880 * @param minute 指定分钟
881 * @param second 指定秒
882 * @return 返回重置时分秒后的时间
883 */
884 public static Date getResetTime(Date date, int hour, int minute, int second) {
885 Calendar cal = Calendar.getInstance();
886 if (date != null) {
887 cal.setTime(date);
888 }
889 cal.set(Calendar.HOUR_OF_DAY, hour);
890 cal.set(Calendar.SECOND, minute);
891 cal.set(Calendar.MINUTE, second);
892 cal.set(Calendar.MILLISECOND, 0);
893 return cal.getTime();
894 }
895
896 /**
897 * 返回指定日期的起始时间
898 *
899 * @param date 指定日期(例如2014-08-01)
900 * @return 返回起始时间(例如2014-08-01 00:00:00)
901 */
902 public static Date getIntegralStartTime(Date date) {
903 return getResetTime(date, 0, 0, 0);
904 }
905
906 /**
907 * 返回指定日期的结束时间
908 *
909 * @param date 指定日期(例如2014-08-01)
910 * @return 返回结束时间(例如2014-08-01 23:59:59)
911 */
912 public static Date getIntegralEndTime(Date date) {
913 return getResetTime(date, 23, 59, 59);
914 }
915
916 /**
917 * 获取指定日期累加年月日后的时间
918 *
919 * @param date 指定日期
920 * @param year 指定年数
921 * @param month 指定月数
922 * @param day 指定天数
923 * @return 返回累加年月日后的时间
924 */
925 public static Date rollDate(Date date, int year, int month, int day) {
926 Calendar cal = Calendar.getInstance();
927 if (date != null) {
928 cal.setTime(date);
929 }
930 cal.add(Calendar.YEAR, year);
931 cal.add(Calendar.MONTH, month);
932 cal.add(Calendar.DAY_OF_MONTH, day);
933 return cal.getTime();
934 }
935
936 /**
937 * 获取指定日期累加指定月数后的时间
938 *
939 * @param date 指定日期
940 * @param month 指定月数
941 * @return 返回累加月数后的时间
942 */
943 public static Date rollMonth(Date date, int month) {
944 return rollDate(date, 0, month, 0);
945 }
946
947 /**
948 * 获取指定日期累加指定天数后的时间
949 *
950 * @param date 指定日期
951 * @param day 指定天数
952 * @return 返回累加天数后的时间
953 */
954 public static Date rollDay(Date date, int day) {
955 return rollDate(date, 0, 0, day);
956 }
957
958 /**
959 * 计算指定日期所在月份的天数
960 *
961 * @param date 指定日期
962 * @return 返回所在月份的天数
963 */
964 public static int getDayOfMonth(Date date) {
965 Calendar cal = Calendar.getInstance();
966 if (date != null) {
967 cal.setTime(date);
968 }
969 int dayOfMonth = cal.getActualMaximum(Calendar.DATE);
970 return dayOfMonth;
971 }
972
973 /**
974 * 获取当月第一天的起始时间,例如2014-08-01 00:00:00
975 *
976 * @return 返回当月第一天的起始时间
977 */
978 public static Date getMonthStartTime() {
979 Calendar cal = Calendar.getInstance();
980 cal.set(Calendar.DAY_OF_MONTH, 1);
981 return getIntegralStartTime(cal.getTime());
982 }
983
984 /**
985 * 获取当月最后一天的结束时间,例如2014-08-31 23:59:59
986 *
987 * @return 返回当月最后一天的结束时间
988 */
989 public static Date getMonthEndTime() {
990 Calendar cal = Calendar.getInstance();
991 cal.set(Calendar.DAY_OF_MONTH, getDayOfMonth(cal.getTime()));
992 return getIntegralEndTime(cal.getTime());
993 }
994
995 /**
996 * 获取上个月第一天的起始时间,例如2014-07-01 00:00:00
997 *
998 * @return 返回上个月第一天的起始时间
999 */
1000 public static Date getLastMonthStartTime() {
1001 Calendar cal = Calendar.getInstance();
1002 cal.add(Calendar.MONTH, -1);
1003 cal.set(Calendar.DAY_OF_MONTH, 1);
1004 return getIntegralStartTime(cal.getTime());
1005 }
1006
1007 /**
1008 * 获取上个月最后一天的结束时间,例如2014-07-31 23:59:59
1009 *
1010 * @return 返回上个月最后一天的结束时间
1011 */
1012 public static Date getLastMonthEndTime() {
1013 Calendar cal = Calendar.getInstance();
1014 cal.add(Calendar.MONTH, -1);
1015 cal.set(Calendar.DAY_OF_MONTH, getDayOfMonth(cal.getTime()));
1016 return getIntegralEndTime(cal.getTime());
1017 }
1018
1019 /**
1020 * 获取下个月第一天的起始时间,例如2014-09-01 00:00:00
1021 *
1022 * @return 返回下个月第一天的起始时间
1023 */
1024 public static Date getNextMonthStartTime() {
1025 Calendar cal = Calendar.getInstance();
1026 cal.add(Calendar.MONTH, 1);
1027 cal.set(Calendar.DAY_OF_MONTH, 1);
1028 return getIntegralStartTime(cal.getTime());
1029 }
1030
1031 /**
1032 * 获取下个月最后一天的结束时间,例如2014-09-30 23:59:59
1033 *
1034 * @return 返回下个月最后一天的结束时间
1035 */
1036 public static Date getNextMonthEndTime() {
1037 Calendar cal = Calendar.getInstance();
1038 cal.add(Calendar.MONTH, 1);
1039 cal.set(Calendar.DAY_OF_MONTH, getDayOfMonth(cal.getTime()));
1040 return getIntegralEndTime(cal.getTime());
1041 }
1042
1043 /**
1044 * 获取当前季度第一天的起始时间
1045 *
1046 * @return 返回当前季度第一天的起始时间
1047 */
1048 public static Date getQuarterStartTime() {
1049 Calendar cal = Calendar.getInstance();
1050 int month = cal.get(Calendar.MONTH);
1051 if (month < 3) {
1052 cal.set(Calendar.MONTH, 0);
1053 } else if (month < 6) {
1054 cal.set(Calendar.MONTH, 3);
1055 } else if (month < 9) {
1056 cal.set(Calendar.MONTH, 6);
1057 } else {
1058 cal.set(Calendar.MONTH, 9);
1059 }
1060 cal.set(Calendar.DAY_OF_MONTH, 1);
1061 return getIntegralStartTime(cal.getTime());
1062 }
1063
1064 /**
1065 * 获取当前季度最后一天的结束时间
1066 *
1067 * @return 返回当前季度最后一天的结束时间
1068 */
1069 public static Date getQuarterEndTime() {
1070 Calendar cal = Calendar.getInstance();
1071 int month = cal.get(Calendar.MONTH);
1072 if (month < 3) {
1073 cal.set(Calendar.MONTH, 2);
1074 } else if (month < 6) {
1075 cal.set(Calendar.MONTH, 5);
1076 } else if (month < 9) {
1077 cal.set(Calendar.MONTH, 8);
1078 } else {
1079 cal.set(Calendar.MONTH, 11);
1080 }
1081 cal.set(Calendar.DAY_OF_MONTH, getDayOfMonth(cal.getTime()));
1082 return getIntegralEndTime(cal.getTime());
1083 }
1084
1085 /**
1086 * 获取前一个工作日
1087 *
1088 * @return 返回前一个工作日
1089 */
1090 public static Date getPrevWorkday() {
1091 Calendar cal = Calendar.getInstance();
1092 cal.add(Calendar.DAY_OF_MONTH, -1);
1093 if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
1094 cal.add(Calendar.DAY_OF_MONTH, -2);
1095 }
1096 if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
1097 cal.add(Calendar.DAY_OF_MONTH, -1);
1098 }
1099 return getIntegralStartTime(cal.getTime());
1100 }
1101
1102 /**
1103 * 获取下一个工作日
1104 *
1105 * @return 返回下个工作日
1106 */
1107 public static Date getNextWorkday() {
1108 Calendar cal = Calendar.getInstance();
1109 cal.add(Calendar.DAY_OF_MONTH, 1);
1110 if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
1111 cal.add(Calendar.DAY_OF_MONTH, 2);
1112 }
1113 if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
1114 cal.add(Calendar.DAY_OF_MONTH, 1);
1115 }
1116 return getIntegralStartTime(cal.getTime());
1117 }
1118
1119 /**
1120 * 获取当周的第一个工作日
1121 *
1122 * @return 返回第一个工作日
1123 */
1124 public static Date getFirstWorkday() {
1125 Calendar cal = Calendar.getInstance();
1126 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
1127 return getIntegralStartTime(cal.getTime());
1128 }
1129
1130 /**
1131 * 获取当周的最后一个工作日
1132 *
1133 * @return 返回最后一个工作日
1134 */
1135 public static Date getLastWorkday() {
1136 Calendar cal = Calendar.getInstance();
1137 cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
1138 return getIntegralStartTime(cal.getTime());
1139 }
1140
1141 /**
1142 * 判断指定日期是否是工作日
1143 *
1144 * @param date 指定日期
1145 * @return 如果是工作日返回true,否则返回false
1146 */
1147 public static boolean isWorkday(Date date) {
1148 Calendar cal = Calendar.getInstance();
1149 if (date != null) {
1150 cal.setTime(date);
1151 }
1152 int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
1153 return !(dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY);
1154 }
1155
1156 /**
1157 * 获取指定日期是星期几
1158 *
1159 * @param date 指定日期
1160 * @return 返回星期几的描述
1161 */
1162 public static String getWeekdayDesc(Date date) {
1163 final String[] weeks = new String[]{"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
1164 Calendar cal = Calendar.getInstance();
1165 if (date != null) {
1166 cal.setTime(date);
1167 }
1168 return weeks[cal.get(Calendar.DAY_OF_WEEK) - 1];
1169 }
1170
1171
1172 /***********2017年10月25日 by左宇新增以下代码***********/
1173
1174 /**
1175 * 获取当年的第一天
1176 * @return
1177 */
1178 public static Date getCurrYearFirst(){
1179 Calendar currCal=Calendar.getInstance();
1180 int currentYear = currCal.get(Calendar.YEAR);
1181 return getYearFirst(currentYear);
1182 }
1183
1184 /**
1185 * 获取当年的最后一天
1186 * @return
1187 */
1188 public static Date getCurrYearLast(){
1189 Calendar currCal=Calendar.getInstance();
1190 int currentYear = currCal.get(Calendar.YEAR);
1191 return getYearLast(currentYear);
1192 }
1193
1194 /**
1195 * 获取某年第一天日期
1196 * @param year 年份
1197 * @return Date
1198 */
1199 public static Date getYearFirst(int year){
1200 Calendar calendar = Calendar.getInstance();
1201 calendar.clear();
1202 calendar.set(Calendar.YEAR, year);
1203 Date currYearFirst = calendar.getTime();
1204 return currYearFirst;
1205 }
1206
1207 /**
1208 * 获取某年最后一天日期
1209 * @param year 年份
1210 * @return Date
1211 */
1212 public static Date getYearLast(int year){
1213 Calendar calendar = Calendar.getInstance();
1214 calendar.clear();
1215 calendar.set(Calendar.YEAR, year);
1216 calendar.roll(Calendar.DAY_OF_YEAR, -1);
1217 Date currYearLast = calendar.getTime();
1218 return currYearLast;
1219 }
1220 /*********** end ***********/
1221
1222 /**
1223 * 获取指定日期的月份第一天的日期
1224 * @param date
1225 * @return
1226 */
1227 public static Date getMonthFirstDate(Date date){
1228 Calendar cal = Calendar.getInstance();
1229 cal.setTime(date);
1230 cal.set(Calendar.DAY_OF_MONTH, 1);
1231 return getIntegralStartTime(cal.getTime());
1232 }
1233 /**
1234 * 获取指定日期的下个月第一天的日期
1235 * @param date
1236 * @return
1237 */
1238 public static Date getNextMonthFirstDate(Date date){
1239 Calendar cal = Calendar.getInstance();
1240 cal.setTime(date);
1241 cal.add(Calendar.MONTH, 1);
1242 cal.set(Calendar.DAY_OF_MONTH, 1);
1243 return getIntegralStartTime(cal.getTime());
1244 }
1245
1246
1247 /***********2018年02月06日 by左宇新增以下代码***********/
1248
1249 /**
1250 * 获取任意时间的年份第一天
1251 * @param date
1252 * @return
1253 * @author zuoy 2018/02/06
1254 */
1255 public static Date getFirstYearDate(Date date) {
1256 Calendar calendar = Calendar.getInstance();
1257 calendar.setTime(date);
1258 int currentYear = calendar.get(Calendar.YEAR);
1259 return getYearFirst(currentYear);
1260 }
1261
1262 /**
1263 * 获取任意时间的年份最后一天
1264 * @param date
1265 * @return
1266 * @author zuoy 2018/02/06
1267 */
1268 public static Date getLastYearDate(Date date) {
1269 Calendar calendar = Calendar.getInstance();
1270 calendar.setTime(date);
1271 int currentYear = calendar.get(Calendar.YEAR);
1272 return getYearLast(currentYear);
1273 }
1274 /**
1275 * 返回指定日期的季的第一天
1276 *
1277 * @param date
1278 * @return
1279 */
1280 public static Date getFirstQuarterDate(Date date) {
1281 Calendar c = Calendar.getInstance();
1282 c.setTime(date);
1283 int currentMonth = c.get(Calendar.MONTH) + 1;
1284 if (currentMonth >= 1 && currentMonth <= 3) {
1285 c.set(Calendar.MONTH, 0);
1286 }else if (currentMonth >= 4 && currentMonth <= 6) {
1287 c.set(Calendar.MONTH, 3);
1288 }else if (currentMonth >= 7 && currentMonth <= 9) {
1289 c.set(Calendar.MONTH, 4);
1290 }else if (currentMonth >= 10 && currentMonth <= 12) {
1291 c.set(Calendar.MONTH, 9);
1292 }else{
1293 c.set(Calendar.DATE, 1);
1294 }
1295 c.set(Calendar.DATE, 1);
1296 return parseDate(c.getTime());
1297 }
1298
1299 /**
1300 * 返回指定日期的季的最后一天
1301 *
1302 * @param date
1303 * @return
1304 */
1305 public static Date getLastQuarterDate(Date date) {
1306 Calendar c = Calendar.getInstance();
1307 c.setTime(date);
1308 int currentMonth = c.get(Calendar.MONTH) + 1;
1309 if (currentMonth >= 1 && currentMonth <= 3) {
1310 c.set(Calendar.MONTH, 2);
1311 c.set(Calendar.DATE, 31);
1312 } else if (currentMonth >= 4 && currentMonth <= 6) {
1313 c.set(Calendar.MONTH, 5);
1314 c.set(Calendar.DATE, 30);
1315 } else if (currentMonth >= 7 && currentMonth <= 9) {
1316 c.set(Calendar.MONTH, 8);
1317 c.set(Calendar.DATE, 30);
1318 } else if (currentMonth >= 10 && currentMonth <= 12) {
1319 c.set(Calendar.MONTH, 11);
1320 c.set(Calendar.DATE, 31);
1321 }
1322 return parseDate(c.getTime());
1323 }
1324
1325 /**
1326 * 获取任意时间的月第一天
1327 * @param date
1328 * @return
1329 * @author zuoy 2018/02/06
1330 */
1331 public static Date getFirstMonthDate(Date date) {
1332 Calendar calendar = Calendar.getInstance();
1333 calendar.setTime(date);
1334 calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
1335 return parseDate(calendar.getTime());
1336 }
1337
1338 /**
1339 * 获取任意时间的月的最后一天
1340 * @param date
1341 * @return
1342 * @author zuoy 2018/02/06
1343 */
1344 public static Date getLastMonthDate(Date date) {
1345 Calendar calendar = Calendar.getInstance();
1346 calendar.setTime(date);
1347 calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
1348 return parseDate(calendar.getTime());
1349 }
1350
1351 /**
1352 * 获取任意时间的周一
1353 * @param date
1354 * @return
1355 * @author zuoy 2018/02/06
1356 */
1357 public static Date getFirstWeekDate(Date date) {
1358 Calendar calendar = Calendar.getInstance();
1359 calendar.setTime(date);
1360 //判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
1361 int dayWeek = calendar.get(Calendar.DAY_OF_WEEK);//获得当前日期是一个星期的第几天
1362 if(1 == dayWeek) {
1363 calendar.add(Calendar.DAY_OF_MONTH, -1);
1364 }
1365 calendar.setFirstDayOfWeek(Calendar.MONDAY);//设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
1366 int day = calendar.get(Calendar.DAY_OF_WEEK);//获得当前日期是一个星期的第几天
1367 calendar.add(Calendar.DATE, calendar.getFirstDayOfWeek()-day);//根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
1368 return parseDate(calendar.getTime());
1369 }
1370
1371 /**
1372 * 获取任意时间的周末
1373 * @param date
1374 * @return
1375 * @author zuoy 2018/02/06
1376 */
1377 public static Date getLastWeekDate(Date date) {
1378 Date firstDate = getFirstWeekDate(date);
1379 Calendar calendar = Calendar.getInstance();
1380 calendar.setTime(firstDate);
1381 calendar.add(Calendar.DATE, 6);
1382 return parseDate(calendar.getTime());
1383 }
1384
1385 /**
1386 * 获取日期属于当年第几季度
1387 *
1388 * @param date
1389 * @return
1390 */
1391 public static int getQuarterOfYear(Date date) {
1392 Calendar calendar = Calendar.getInstance();
1393 calendar.setTime(date);
1394 return calendar.get(Calendar.MONTH) / 3 + 1;
1395 }
1396
1397 /**
1398 * 获取日期属于当年第几周
1399 * @param date
1400 * @return
1401 * @author zuoy 2018/02/06
1402 */
1403 public static int getWeekOfYear(Date date){
1404 Calendar calendar = Calendar.getInstance();
1405 calendar.setFirstDayOfWeek(Calendar.MONDAY);
1406 calendar.setTime(date);
1407 return calendar.get(Calendar.WEEK_OF_YEAR);
1408 }
1409
1410 /**
1411 * 获取指定日期年份
1412 * @param date
1413 * @return
1414 * @author zuoy 2018/02/06
1415 */
1416 public static int getYear(Date date) {
1417 Calendar calendar = Calendar.getInstance();
1418 calendar.setTime(date);
1419 return calendar.get(Calendar.YEAR);
1420 }
1421 /**
1422 * 获取指定日期月份
1423 * @param date
1424 * @return
1425 * @author zuoy 2018/02/06
1426 */
1427 public static int getMonth(Date date) {
1428 Calendar calendar = Calendar.getInstance();
1429 calendar.setTime(date);
1430 return calendar.get(Calendar.MONTH) + 1;
1431 }
1432
1433 /**
1434 * 日期的增加月份
1435 *
1436 * @param date 日期
1437 * @param addMonth 增加的月份,正数表示增加,负数表示减少
1438 * @return Date 日期的增加月数后的结果
1439 * @author zuoy 2018/02/09
1440 */
1441 public static Date addMonth(Date date, int addMonth) {
1442 Calendar calendar = Calendar.getInstance();
1443 calendar.setTime(date);
1444 calendar.add(Calendar.MONTH, addMonth);
1445 return new Date(calendar.getTime().getTime());
1446 }
1447 /*********** end ***********/
1448
1449 /***********2018年03月13日 by左宇新增以下代码***********/
1450 /**
1451 * 日期的增加年份
1452 *
1453 * @param date 日期
1454 * @param addYear 增加的周数,正数表示增加,负数表示减少
1455 * @return Date 日期的增加年份后的结果
1456 */
1457 public static Date addYear(Date date, int addYear) {
1458 Calendar calendar = Calendar.getInstance();
1459 calendar.setTime(date);
1460 calendar.add(Calendar.YEAR, addYear);
1461 return new Date(calendar.getTime().getTime());
1462 }
1463
1464 /**
1465 * 日期的增加季度
1466 *
1467 * @param date 日期
1468 * @param addQuarter 增加的周数,正数表示增加,负数表示减少
1469 * @return Date 日期的增加季度后的结果
1470 */
1471 public static Date addQuarter(Date date, int addQuarter) {
1472 int newAddQuarter = addQuarter < 0 ? addQuarter - 3 : addQuarter + 3;
1473 Calendar calendar = Calendar.getInstance();
1474 calendar.setTime(date);
1475 calendar.add(Calendar.MONTH, newAddQuarter);
1476 return new Date(calendar.getTime().getTime());
1477 }
1478 /**
1479 * 日期的增加周数
1480 *
1481 * @param date 日期
1482 * @param addWeek 增加的周数,正数表示增加,负数表示减少
1483 * @return Date 日期的增加周数后的结果
1484 */
1485 public static Date addWeek(Date date, int addWeek) {
1486 Calendar calendar = Calendar.getInstance();
1487 calendar.setTime(date);
1488 calendar.add(Calendar.WEEK_OF_YEAR, addWeek);
1489 return new Date(calendar.getTime().getTime());
1490 }
1491
1492 /**
1493 * 获取日期属于当月第几周
1494 *
1495 * @param date
1496 * @return
1497 * @throws Exception
1498 */
1499 public static int getWeekOfMonth(Date date){
1500 Calendar calendar = Calendar.getInstance();
1501 calendar.setTime(date);
1502 //第几周
1503 int week = calendar.get(Calendar.WEEK_OF_MONTH);
1504 //第几天,从周日开始
1505 int day = calendar.get(Calendar.DAY_OF_WEEK);
1506 return week;
1507 }
1508
1509 /**
1510 * 将字符串转为yyyy-MM-dd日期类型
1511 *
1512 * @param dateStr
1513 * @return
1514 * @author zuoy 2018-03-13
1515 */
1516 public static Date parseDate(String dateStr) {
1517 return parse(dateStr, "yyyy-MM-dd");
1518 }
1519
1520 /*********** end ***********/
1521
1522
1523 }