1 package com.XXXXX.XXXXXXX.XXXXXXXX; 2 3 import java.sql.Timestamp; 4 import java.text.DateFormat; 5 import java.text.ParseException; 6 import java.text.SimpleDateFormat; 7 import java.util.Calendar; 8 import java.util.Date; 9 import java.util.StringTokenizer; 10 import java.util.regex.Matcher; 11 import java.util.regex.Pattern; 12 13 /** 14 * 日期时间管理类. 15 * <p> 16 * Title: CicroDate 17 * </p> 18 * <p> 19 * Description: 日期时间管理 20 * </p> 21 * <p> 22 * Copyright: Copyright (c) 2002 23 * </p> 24 * <p> 25 * Company: Cicro 26 * </p> 27 * 28 * @author kongxx 29 * @author Sunyi 30 * @version 1.3 * 31 */ 32 33 public class DateUtil { 34 private static final String DATE_PATTERN = "yyyy-MM-dd"; 35 private static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; 36 37 /** 38 * 获取当前系统时间. 默认模板格式yyyy-MM-dd hh:mm:ss. 39 * 40 * @return 当前系统时间 41 */ 42 public static String getCurrentDateTime() { 43 return getCurrentDateTime(DATETIME_PATTERN); 44 } 45 46 /** 47 * 获取当前系统同期。 48 * 49 * @return 当前系统日期 50 * @author zhenggz 2003-11-09 51 */ 52 public static String getCurrentDate() { 53 return getCurrentDateTime(DATE_PATTERN); 54 } 55 56 /** 57 * 获取当前系统时间. 58 * 59 * @param strPattern 60 * 时间模板 61 * @return 当前系统时间 62 */ 63 public static String getCurrentDateTime(String pattern) { 64 Calendar cal = Calendar.getInstance(); 65 SimpleDateFormat sdf = new SimpleDateFormat(pattern); 66 return sdf.format(cal.getTime()); 67 } 68 69 /** 70 * 把字串转化成为Date对象,时间字串格式为2000-01-01 00:00:00 71 * 72 * @param dateString 73 * 被转化的时间字串,以 yyyy-MM-dd HH:mm:ss 的格式 74 * @throws ParseException 75 * */ 76 public static Date getDate(String dateStr) throws ParseException { 77 return getDate(dateStr, DATETIME_PATTERN); 78 } 79 80 /** 81 * 把字串转化成为Date对象,时间字串格式需要设定 82 * 83 * @param dateString 84 * 被转化的时间字串 85 * @param pattern 86 * 时间字串的日期格式,如yyyy-MM-dd 87 * @throws ParseException 88 * */ 89 public static Date getDate(String dateStr, String pattern) 90 throws ParseException { 91 Date date = null; 92 SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); 93 date = dateFormat.parse(dateStr); 94 95 return date; 96 } 97 98 /** 99 * 取得日期字串 100 * 101 * @param date 102 * Date对象 103 * @return 日期字串,格式如:2003-12-02 104 * */ 105 public static String getDateString(Date date) { 106 return getString(date, DATE_PATTERN); 107 } 108 109 /** 110 * 取得日期时间字串 111 * 112 * @param date 113 * Date对象 114 * @return 日期时间字串,格式如:2003-12-02 13:10:00 115 * */ 116 public static String getDateTimeString(Date date) { 117 return getString(date, DATETIME_PATTERN); 118 } 119 120 /** 121 * 按照指定格式取得时间字串 122 * 123 * @param date 124 * Date对象 125 * @param pattern 126 * 时间字串的日期格式,如yyyy-MM-dd 127 * @return 日期时间字串,格式如:2003-12-02 13:10:00 128 * */ 129 public static String getString(Date date, String pattern) { 130 SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); 131 132 return dateFormat.format(date); 133 } 134 135 /** 136 * 格式化日期字串 137 * 138 * @param dateStr 139 * @return 格式化后的字串,格式如:2003-12-02 140 * */ 141 public static String formatToDateString(String dateStr) 142 throws ParseException { 143 return formatToString(dateStr, DATE_PATTERN); 144 } 145 146 /** 147 * 格式化日期时间字串 148 * 149 * @param dateTimeStr 150 * @return String 格式化后的字串,格式如:2003-12-02 12:12:10 151 * */ 152 public static String formatToDateTimeString(String dateTimeStr) 153 throws ParseException { 154 return formatToString(dateTimeStr, DATETIME_PATTERN); 155 } 156 157 /** 158 * 格式化日期时间字串为指定的格式字串 159 * 160 * @param String 161 * 时间字串 162 * @param String 163 * 时间字串的日期格式,如yyyy-MM-dd 164 * @return String 格式化后的字串,格式如:2003-12-02 12:12:10 165 * */ 166 public static String formatToString(String dateStr, String pattern) 167 throws ParseException { 168 dateStr = format(dateStr); 169 Date date = null; 170 if (checkDateString(dateStr)) { 171 date = getDate(dateStr, DATE_PATTERN); 172 return getString(date, pattern); 173 } else if (checkDateTimeString(dateStr)) { 174 date = getDate(dateStr); 175 return getString(date, pattern); 176 } else { 177 throw new ParseException("日期格式不正确", 1); 178 } 179 } 180 181 /** 182 * 检查日期字串的格式 183 * 184 * @param String 185 * 时间字串 YYYY-MM-DD 186 * @return boolean true or false 187 * */ 188 public static boolean checkDateString(String dateStr) { 189 Pattern pattern = Pattern.compile("\d{2,4}-\d{1,2}-\d{1,2}"); 190 Matcher matcher = pattern.matcher(dateStr); 191 192 return matcher.matches(); 193 } 194 195 /** 196 * 检查日期时间字串的格式 197 * 198 * @param String 199 * 时间字串 YYYY-MM-DD hh:mm:ss 200 * @return boolean true or false 201 * */ 202 public static boolean checkDateTimeString(String dateTimeStr) { 203 Pattern pattern = Pattern 204 .compile("\d{2,4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}"); 205 Matcher matcher = pattern.matcher(dateTimeStr); 206 207 return matcher.matches(); 208 } 209 210 /** 211 * 规范化时间字串 212 * 213 * @param String 214 * 时间字串 215 * @return String 格式化后的字串,格式如:2003-12-02 12:12:10 216 * */ 217 public static String format(String dateStr) { 218 Pattern pattern = Pattern 219 .compile("\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.*"); 220 Matcher matcher = pattern.matcher(dateStr); 221 if (matcher.matches()) { 222 dateStr = dateStr.substring(0, 19); 223 } else { 224 pattern = Pattern.compile("\d{4}-\d{2}-\d{2}.*"); 225 matcher = pattern.matcher(dateStr); 226 if (matcher.matches()) { 227 dateStr = dateStr.substring(0, 10); 228 } 229 } 230 231 return dateStr; 232 } 233 234 /** 235 * History 2004-08-09 Added by xiecs 增加了根据Date对象获得年,月,日等信息的方法 236 * 获得某天的开始时间和结束时间,获得一周的开始时间和结束时间的方法 237 * 238 * @param Date 239 * date 时间对象 240 * @return int 返回这日期的年份 格式如:2010 241 */ 242 public static int getYear(Date date) { 243 Calendar calendar = Calendar.getInstance(); 244 calendar.setTime(date); 245 int year = calendar.get(Calendar.YEAR); 246 return year; 247 } 248 249 /** 250 * History 2004-08-09 Added by xiecs 增加了根据Date对象获得年,月,日等信息的方法 251 * 获得某天的开始时间和结束时间,获得一周的开始时间和结束时间的方法 252 * 253 * @param Date 254 * date 时间对象 255 * @return int 返回这日期的月份 格式如:11 256 */ 257 public static int getMonth(Date date) { 258 Calendar calendar = Calendar.getInstance(); 259 calendar.setTime(date); 260 int month = calendar.get(Calendar.MONTH); 261 return month; 262 } 263 264 /** 265 * History 2004-08-09 Added by xiecs 增加了根据Date对象获得年,月,日等信息的方法 266 * 获得某天的开始时间和结束时间,获得一周的开始时间和结束时间的方法 267 * 268 * @param Date 269 * date 时间对象 270 * @return int 返回这日期在当月的第几天 格式如:15 271 */ 272 public static int getDayOfMonth(Date date) { 273 Calendar calendar = Calendar.getInstance(); 274 calendar.setTime(date); 275 int day = calendar.get(Calendar.DAY_OF_MONTH); 276 return day; 277 } 278 279 /** 280 * History 2004-08-09 Added by xiecs 增加了根据Date对象获得年,月,日等信息的方法 281 * 获得某天的开始时间和结束时间,获得一周的开始时间和结束时间的方法 282 * 283 * @param Date 284 * date 时间对象 285 * @return int 返回这日期在第几周 格式如:52 286 */ 287 public static int getDayOfWek(Date date) { 288 Calendar calendar = Calendar.getInstance(); 289 calendar.setTime(date); 290 int day = calendar.get(Calendar.DAY_OF_WEEK); 291 return day; 292 } 293 294 /** 295 * History 2004-08-09 Added by xiecs 增加了根据Date对象获得年,月,日等信息的方法 296 * 获得某天的开始时间和结束时间,获得一周的开始时间和结束时间的方法 297 * 298 * @param Date 299 * date 时间对象 300 * @return int 返回这日期的小时 格式如:23 301 */ 302 public static int getHour(Date date) { 303 Calendar calendar = Calendar.getInstance(); 304 calendar.setTime(date); 305 int hour = calendar.get(Calendar.HOUR_OF_DAY); 306 return hour; 307 } 308 309 /** 310 * History 2004-08-09 Added by xiecs 增加了根据Date对象获得年,月,日等信息的方法 311 * 获得某天的开始时间和结束时间,获得一周的开始时间和结束时间的方法 312 * 313 * @param Date 314 * date 时间对象 315 * @return int 返回这日期的分钟 格式如:59 316 */ 317 public static int getMinute(Date date) { 318 Calendar calendar = Calendar.getInstance(); 319 calendar.setTime(date); 320 int minute = calendar.get(Calendar.MINUTE); 321 return minute; 322 } 323 324 /** 325 * History 2004-08-09 Added by xiecs 增加了根据Date对象获得年,月,日等信息的方法 326 * 获得某天的开始时间和结束时间,获得一周的开始时间和结束时间的方法 327 * 328 * @param Date 329 * date 时间对象 330 * @return int 返回这日期的秒钟 格式如:40 331 */ 332 public static int getSecond(Date date) { 333 Calendar calendar = Calendar.getInstance(); 334 calendar.setTime(date); 335 int second = calendar.get(Calendar.SECOND); 336 return second; 337 } 338 339 /** 340 * 获得某天的开始时间的Date对象,一般用来作比较用 341 * 342 * @param Date 343 * date 时间对象 344 * @return Date 345 */ 346 public static Date getStartOfDay(Date date) { 347 Date startDate = null; 348 try { 349 startDate = DateUtil.getDate( 350 DateUtil.getString(date, "yyyy-MM-dd"), "yyyy-MM-dd"); 351 } catch (Exception e) { 352 return null; 353 } 354 return startDate; 355 } 356 357 /** 358 * 获得某天的结束时间的Date对象,一般用来作比较用 359 * 360 * @param Date 361 * date 时间对象 362 * @return Date 363 */ 364 public static Date getEndOfDay(Date date) { 365 Calendar calendar = Calendar.getInstance(); 366 Date endDate = null; 367 try { 368 calendar.set(DateUtil.getYear(date), DateUtil.getMonth(date), 369 DateUtil.getDayOfMonth(date), 23, 59, 59); 370 endDate = calendar.getTime(); 371 } catch (Exception e) { 372 return null; 373 } 374 return endDate; 375 } 376 377 /** 378 * 获得某天所在的星期的第一天(星期一)的开始时间(0时0分0秒)Date对象,一般用来作比较用 379 * 380 * @param Date 381 * date 时间对象 382 * @return Date 383 */ 384 public static Date getStartOfWeek(Date date) { 385 Calendar calendar = Calendar.getInstance(); 386 calendar.setTime(date); 387 int n = 0; 388 int day = calendar.get(Calendar.DAY_OF_WEEK); 389 switch (day) { 390 case Calendar.MONDAY: { 391 n = 0; 392 break; 393 } 394 case Calendar.TUESDAY: { 395 n = 1; 396 break; 397 } 398 case Calendar.WEDNESDAY: { 399 n = 2; 400 break; 401 } 402 case Calendar.THURSDAY: { 403 n = 3; 404 break; 405 } 406 case Calendar.FRIDAY: { 407 n = 4; 408 break; 409 } 410 case Calendar.SATURDAY: { 411 n = 5; 412 break; 413 } 414 case Calendar.SUNDAY: { 415 n = 6; 416 break; 417 } 418 } 419 Date monday = new Date(date.getTime() - 24 * 60 * 60 * 1000 * n); 420 Date startDate = getStartOfDay(monday); 421 return startDate; 422 } 423 424 /** 425 * 获得某天所在的星期的最后一天(星期天)的结束时间(23时59分59秒)Date对象,一般用来作比较用 426 * 427 * @param Date 428 * date 时间对象 429 * @return Date 430 */ 431 public static Date getEndOfWeek(Date date) { 432 Calendar calendar = Calendar.getInstance(); 433 calendar.setTime(date); 434 int n = 0; 435 int day = calendar.get(Calendar.DAY_OF_WEEK); 436 switch (day) { 437 case Calendar.MONDAY: { 438 n = 6; 439 break; 440 } 441 case Calendar.TUESDAY: { 442 n = 5; 443 break; 444 } 445 case Calendar.WEDNESDAY: { 446 n = 4; 447 break; 448 } 449 case Calendar.THURSDAY: { 450 n = 3; 451 break; 452 } 453 case Calendar.FRIDAY: { 454 n = 2; 455 break; 456 } 457 case Calendar.SATURDAY: { 458 n = 1; 459 break; 460 } 461 case Calendar.SUNDAY: { 462 n = 0; 463 break; 464 } 465 } 466 Date sunday = new Date(date.getTime() + 24 * 60 * 60 * 1000 * n); 467 Date startDate = getEndOfDay(sunday); 468 return startDate; 469 } 470 471 /** 472 * 判断两个日期之间相差的天数 473 * 474 * @param String 475 * day1 时间1 2010-01-03 476 * @param String 477 * day1 时间2 2010-01-05 478 * @return long 相差天数 479 */ 480 public static long daysOf2Day(String day1, String day2) { 481 try { 482 day1 += " 00:00:00"; 483 day2 += " 00:00:00"; 484 long secs = secsOf2Day(day1, day2); 485 return secs / (24 * 60 * 60); 486 } catch (Exception e) { 487 return -1; 488 } 489 } 490 491 /** 492 * 判断两个时间之间相差的天数 493 * 494 * @param String 495 * day1 时间1 2010-01-03 00:00:00 496 * @param String 497 * day1 时间2 2010-01-05 10:25:44 498 * @return long 相差天数 499 */ 500 public static long secsOf2Day(String day1, String day2) { 501 try { 502 Date date1 = getDate(day1); 503 Date date2 = getDate(day2); 504 long secs = Math.abs(date1.getTime() - date2.getTime()) / 1000; 505 return secs; 506 } catch (Exception e) { 507 return -1; 508 } 509 } 510 511 /** 512 * 获得到当前时间为止的天数,不足一天按一天计. 513 * 514 * @param strDateTime 515 * 'yyyy-mm-dd hh:mm:ss' 516 * @return 天数 517 */ 518 public static String getDaysToNow(String strDateTime) { 519 try { 520 StringTokenizer strToken = new StringTokenizer(strDateTime, " "); 521 StringTokenizer strTokenDate = new StringTokenizer( 522 strToken.nextToken(), "-"); 523 StringTokenizer strTokenTime = new StringTokenizer( 524 strToken.nextToken(), ":"); 525 int intYear = Integer.parseInt(strTokenDate.nextToken()); 526 int intMonth = Integer.parseInt(strTokenDate.nextToken()) - 1; 527 int intDay = Integer.parseInt(strTokenDate.nextToken()); 528 int intHour = Integer.parseInt(strTokenTime.nextToken()); 529 int intMin = Integer.parseInt(strTokenTime.nextToken()); 530 int intSec = Integer.parseInt(strTokenTime.nextToken()); 531 532 Calendar cal = Calendar.getInstance(); 533 cal.set(intYear, intMonth, intDay, intHour, intMin, intSec); 534 long longDays = (new Date().getTime() - cal.getTimeInMillis()) / 24 535 / 60 / 60 / 1000; 536 longDays = longDays == 0 ? 1 : longDays; 537 538 return "" + longDays; 539 } catch (Exception e) { 540 return "0"; 541 } 542 } 543 544 /** 545 * 比较两个时间的差值 546 * 547 * @param date1 548 * yyyy-MM-dd HH:mm:ss 549 * @param date2 550 * yyyy-MM-dd HH:mm:ss 551 * @return int 小时 552 */ 553 public static long compareDatetime(String date1, String date2) { 554 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 555 long timestamp1 = -1; 556 long timestamp2 = -1; 557 // 先将时间格式转换成Timestamp 558 try { 559 timestamp1 = df.parse(date1).getTime() / 1000; 560 timestamp2 = df.parse(date2).getTime() / 1000; 561 } catch (ParseException e) { 562 System.out.println("时间格式 [ " + date1 + " ] 或 [ " + date2 563 + " ] 无法被解析"); 564 return -1; 565 } 566 if (timestamp1 > timestamp2) 567 return (timestamp1 - timestamp2) / 3600; 568 else 569 return (timestamp2 - timestamp1) / 3600; 570 571 } 572 573 /** 574 * 得到某个数值之后的时间 575 * 576 * @param String 577 * yyyy-MM-dd HH:mm:ss 578 * @param int 整数 579 * @return String yyyy-MM-dd HH:mm:ss 580 */ 581 public static Date getDateTimesAfter(String datetimes, int day) { 582 Calendar now = Calendar.getInstance(); 583 try { 584 now.setTime(getDate(datetimes, DATETIME_PATTERN)); 585 } catch (ParseException e) { 586 System.out.println("时间格式 [ " + datetimes + " ] 无法被解析"); 587 return null; 588 } 589 now.set(Calendar.DATE, now.get(Calendar.DATE) + day); 590 return now.getTime(); 591 } 592 593 /** 594 * 得到某个数值之后的时间 595 * 596 * @param String 597 * yyyy-MM-dd HH:mm:ss or yyyy-MM-dd 598 * @param int 整数 599 * @return String yyyy-MM-dd 600 */ 601 public static Date getDateAfter(String datetimes, int day) { 602 Calendar now = Calendar.getInstance(); 603 try { 604 now.setTime(getDate(datetimes, DATE_PATTERN)); 605 } catch (ParseException e) { 606 System.out.println("时间格式 [ " + datetimes + " ] 无法被解析"); 607 return null; 608 } 609 now.set(Calendar.DATE, now.get(Calendar.DATE) + day); 610 return now.getTime(); 611 } 612 613 /** 614 * 得到某个数值之前的日期 615 * 616 * @param String 617 * yyyy-MM-dd HH:mm:ss or yyyy-MM-dd 618 * @param int 整数 619 * @return String yyyy-MM-dd 620 */ 621 public static String getDateBefore(String datetimes, int day) { 622 Calendar now = Calendar.getInstance(); 623 try { 624 now.setTime(getDate(datetimes, DATE_PATTERN)); 625 } catch (ParseException e) { 626 System.out.println("时间格式 [ " + datetimes + " ] 无法被解析"); 627 return null; 628 } 629 now.set(Calendar.DATE, now.get(Calendar.DATE) - day); 630 return getString(now.getTime(), "yyyy-MM-dd"); 631 } 632 633 /** 634 * 将某个时间的Timestamp转换成Datetime 635 * 636 * @param long 时间数值 637 * @param String 638 * 时间格式 yyyy-MM-dd hh:mm:ss 639 * @return String yyyy-MM-dd hh:mm:ss 640 */ 641 public static String timestampToDate(long timestamp, String format) { 642 Date date = new Timestamp(timestamp); 643 DateFormat df = new SimpleDateFormat(format); 644 return df.format(date); 645 } 646 647 /** 648 * 得到当前时间的数值 649 * 650 * @return String yyyy-MM-dd hh:mm:ss 651 */ 652 public static long dateToTimestamp() { 653 long ts = System.currentTimeMillis(); 654 return ts; 655 } 656 657 /** 658 * 得到指定时间之后的时间 659 * 660 * @param String 661 * time 662 * @param int num 663 * @return String yyyy-MM-dd hh:mm:ss 664 */ 665 public static String getDateTimeAfter(String times, int num) { 666 if (times == null || "".equals(times)) 667 times = getCurrentDateTime(); 668 669 long tl = dateToTimestamp(times) + num * 1000; 670 return timestampToDate(tl, "yyyy-MM-dd HH:mm:ss"); 671 } 672 673 /** 674 * 将某个时间的Datetime转换成Timestamp 675 * 676 * @param dateFormat 677 * yyyy-MM-dd HH:mm:ss 678 * @return long 679 */ 680 public static long dateToTimestamp(String dateFormat) { 681 long timestamp = -1; 682 try { 683 DateFormat df = new SimpleDateFormat(DATETIME_PATTERN); 684 Date date = df.parse(dateFormat); 685 timestamp = date.getTime(); 686 } catch (Exception e) { 687 System.out.println("时间格式 [ " + dateFormat + " ] 无法被解析"); 688 } 689 return timestamp; 690 } 691 692 public static long compareDatetime2(String date1, String date2) { 693 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); 694 long timestamp1 = -1; 695 long timestamp2 = -1; 696 // 先将时间格式转换成Timestamp 697 try { 698 timestamp1 = df.parse(date1).getTime(); 699 timestamp2 = df.parse(date2).getTime(); 700 } catch (ParseException e) { 701 System.out.println("时间格式 [ " + date1 + " ] 或 [ " + date2 702 + " ] 无法被解析"); 703 return -1; 704 } 705 if (timestamp1 > timestamp2) 706 return (timestamp1 - timestamp2); 707 else 708 return (timestamp2 - timestamp1); 709 710 } 711 712 // 对比两个日期大小 713 public static boolean compare_date(String DATE1, String DATE2) { 714 DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 715 try { 716 Date dt1 = df.parse(DATE1); 717 Date dt2 = df.parse(DATE2); 718 if (dt1.getTime() > dt2.getTime()) { 719 // System.out.println("dt1 在dt2前"); 720 return false; 721 } else if (dt1.getTime() < dt2.getTime()) { 722 // System.out.println("dt1在dt2后"); 723 return true; 724 } else { 725 return true; 726 } 727 } catch (Exception exception) { 728 exception.printStackTrace(); 729 } 730 return true; 731 } 732 733 public static void main(String[] args) throws Exception { 734 // System.out.println(getDaysToNow("2010-01-10 00:00:00")); 735 // System.out.println(compare_date("2011-05-16 17:50:50","2011-05-16 17:50:55")); 736 // System.out.println(getDateTimesAfter("2010-01-10 12:00:00",-5)); 737 // System.out.println(getDateAfter("2010-01-10",-5)); 738 // System.out.println(timestampToDate(1262575579707L,"yyyy-MM-dd HH:mm:ss")); 739 System.out.println(compareDatetime("2012-02-02 17:36:46:673", 740 "2012-02-03 18:47:37:392")); 741 742 // "2010-01-20 17:58:37:319","2010-01-20 18:44:32:592" ibatis + bonecp 743 // 27ss 744 // "2010-01-21 14:51:49:307","2010-01-21 15:47:45:794" hib + c3p0 33ss 745 // "2010-01-21 17:36:46:673","2010-01-21 18:47:37:392" ibatis + c3p0 746 // 42ss 747 748 // System.out.println(dateToTimestamp()); 749 // System.out.println(timestampToDate(1268231397000L-120000,"yyyy-MM-dd HH:mm:ss")); 750 751 System.out.println(DateUtil.getDateString(getDateAfter( 752 "2012-02-02 17:36:46", 30))); 753 } 754 }