view sourceprint?001 package com.***.product.util; 002 003 import java.text.ParsePosition; 004 import java.text.SimpleDateFormat; 005 import java.util.Calendar; 006 import java.util.Date; 007 import java.util.GregorianCalendar; 008 import java.util.regex.Pattern; 009 010 import org.apache.commons.logging.Log; 011 import org.apache.commons.logging.LogFactory; 012 013 014 public class DateUtil { 015 protected static Log logger = LogFactory.getLog(DateUtil.class); 016 017 // 格式:年-月-日 小时:分钟:秒 018 public static final String FORMAT_ONE = "yyyy-MM-dd HH:mm:ss"; 019 020 // 格式:年-月-日 小时:分钟 021 public static final String FORMAT_TWO = "yyyy-MM-dd HH:mm"; 022 023 // 格式:年月日 小时分钟秒 024 public static final String FORMAT_THREE = "yyyyMMdd-HHmmss"; 025 026 // 格式:年-月-日 027 public static final String LONG_DATE_FORMAT = "yyyy-MM-dd"; 028 029 // 格式:月-日 030 public static final String SHORT_DATE_FORMAT = "MM-dd"; 031 032 // 格式:小时:分钟:秒 033 public static final String LONG_TIME_FORMAT = "HH:mm:ss"; 034 035 //格式:年-月 036 public static final String MONTG_DATE_FORMAT = "yyyy-MM"; 037 038 // 年的加减 039 public static final int SUB_YEAR = Calendar.YEAR; 040 041 // 月加减 042 public static final int SUB_MONTH = Calendar.MONTH; 043 044 // 天的加减 045 public static final int SUB_DAY = Calendar.DATE; 046 047 // 小时的加减 048 public static final int SUB_HOUR = Calendar.HOUR; 049 050 // 分钟的加减 051 public static final int SUB_MINUTE = Calendar.MINUTE; 052 053 // 秒的加减 054 public static final int SUB_SECOND = Calendar.SECOND; 055 056 static final String dayNames[] = { "星期日", "星期一", "星期二", "星期三", "星期四", 057 "星期五", "星期六" }; 058 059 @SuppressWarnings("unused") 060 private static final SimpleDateFormat timeFormat = new SimpleDateFormat( 061 "yyyy-MM-dd HH:mm:ss"); 062 063 public DateUtil() { 064 } 065 066 /** 067 * 把符合日期格式的字符串转换为日期类型 068 * 069 * @param dateStr 070 * @return 071 */ 072 public static java.util.Date stringtoDate(String dateStr, String format) { 073 Date d = null; 074 SimpleDateFormat formater = new SimpleDateFormat(format); 075 try { 076 formater.setLenient(false); 077 d = formater.parse(dateStr); 078 } catch (Exception e) { 079 // log.error(e); 080 d = null; 081 } 082 return d; 083 } 084 085 /** 086 * 把符合日期格式的字符串转换为日期类型 087 */ 088 public static java.util.Date stringtoDate(String dateStr, String format, 089 ParsePosition pos) { 090 Date d = null; 091 SimpleDateFormat formater = new SimpleDateFormat(format); 092 try { 093 formater.setLenient(false); 094 d = formater.parse(dateStr, pos); 095 } catch (Exception e) { 096 d = null; 097 } 098 return d; 099 } 100 101 /** 102 * 把日期转换为字符串 103 * 104 * @param date 105 * @return 106 */ 107 public static String dateToString(java.util.Date date, String format) { 108 String result = ""; 109 SimpleDateFormat formater = new SimpleDateFormat(format); 110 try { 111 result = formater.format(date); 112 } catch (Exception e) { 113 // log.error(e); 114 } 115 return result; 116 } 117 118 /** 119 * 获取当前时间的指定格式 120 * 121 * @param format 122 * @return 123 */ 124 public static String getCurrDate(String format) { 125 return dateToString(new Date(), format); 126 } 127 128 /** 129 * 130 * @param dateStr 131 * @param amount 132 * @return 133 */ 134 public static String dateSub(int dateKind, String dateStr, int amount) { 135 Date date = stringtoDate(dateStr, FORMAT_ONE); 136 Calendar calendar = Calendar.getInstance(); 137 calendar.setTime(date); 138 calendar.add(dateKind, amount); 139 return dateToString(calendar.getTime(), FORMAT_ONE); 140 } 141 142 /** 143 * 两个日期相减 144 * 145 * @param firstTime 146 * @param secTime 147 * @return 相减得到的秒数 148 */ 149 public static long timeSub(String firstTime, String secTime) { 150 long first = stringtoDate(firstTime, FORMAT_ONE).getTime(); 151 long second = stringtoDate(secTime, FORMAT_ONE).getTime(); 152 return (second - first) / 1000; 153 } 154 155 /** 156 * 获得某月的天数 157 * 158 * @param year 159 * int 160 * @param month 161 * int 162 * @return int 163 */ 164 public static int getDaysOfMonth(String year, String month) { 165 int days = 0; 166 if (month.equals("1") || month.equals("3") || month.equals("5") 167 || month.equals("7") || month.equals("8") || month.equals("10") 168 || month.equals("12")) { 169 days = 31; 170 } else if (month.equals("4") || month.equals("6") || month.equals("9") 171 || month.equals("11")) { 172 days = 30; 173 } else { 174 if ((Integer.parseInt(year) % 4 == 0 && Integer.parseInt(year) % 100 != 0) 175 || Integer.parseInt(year) % 400 == 0) { 176 days = 29; 177 } else { 178 days = 28; 179 } 180 } 181 182 return days; 183 } 184 185 /** 186 * 获取某年某月的天数 187 * 188 * @param year 189 * int 190 * @param month 191 * int 月份[1-12] 192 * @return int 193 */ 194 public static int getDaysOfMonth(int year, int month) { 195 Calendar calendar = Calendar.getInstance(); 196 calendar.set(year, month - 1, 1); 197 return calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 198 } 199 200 /** 201 * 获得当前日期 202 * 203 * @return int 204 */ 205 public static int getToday() { 206 Calendar calendar = Calendar.getInstance(); 207 return calendar.get(Calendar.DATE); 208 } 209 210 /** 211 * 获得当前月份 212 * 213 * @return int 214 */ 215 public static int getToMonth() { 216 Calendar calendar = Calendar.getInstance(); 217 return calendar.get(Calendar.MONTH) + 1; 218 } 219 220 /** 221 * 获得当前年份 222 * 223 * @return int 224 */ 225 public static int getToYear() { 226 Calendar calendar = Calendar.getInstance(); 227 return calendar.get(Calendar.YEAR); 228 } 229 230 /** 231 * 返回日期的天 232 * 233 * @param date 234 * Date 235 * @return int 236 */ 237 public static int getDay(Date date) { 238 Calendar calendar = Calendar.getInstance(); 239 calendar.setTime(date); 240 return calendar.get(Calendar.DATE); 241 } 242 243 /** 244 * 返回日期的年 245 * 246 * @param date 247 * Date 248 * @return int 249 */ 250 public static int getYear(Date date) { 251 Calendar calendar = Calendar.getInstance(); 252 calendar.setTime(date); 253 return calendar.get(Calendar.YEAR); 254 } 255 256 /** 257 * 返回日期的月份,1-12 258 * 259 * @param date 260 * Date 261 * @return int 262 */ 263 public static int getMonth(Date date) { 264 Calendar calendar = Calendar.getInstance(); 265 calendar.setTime(date); 266 return calendar.get(Calendar.MONTH) + 1; 267 } 268 269 /** 270 * 计算两个日期相差的天数,如果date2 > date1 返回正数,否则返回负数 271 * 272 * @param date1 273 * Date 274 * @param date2 275 * Date 276 * @return long 277 */ 278 public static long dayDiff(Date date1, Date date2) { 279 return (date2.getTime() - date1.getTime()) / 86400000; 280 } 281 282 /** 283 * 比较两个日期的年差 284 * 285 * @param befor 286 * @param after 287 * @return 288 */ 289 public static int yearDiff(String before, String after) { 290 Date beforeDay = stringtoDate(before, LONG_DATE_FORMAT); 291 Date afterDay = stringtoDate(after, LONG_DATE_FORMAT); 292 return getYear(afterDay) - getYear(beforeDay); 293 } 294 295 /** 296 * 比较指定日期与当前日期的差 297 * 298 * @param befor 299 * @param after 300 * @return 301 */ 302 public static int yearDiffCurr(String after) { 303 Date beforeDay = new Date(); 304 Date afterDay = stringtoDate(after, LONG_DATE_FORMAT); 305 return getYear(beforeDay) - getYear(afterDay); 306 } 307 308 /** 309 * 比较指定日期与当前日期的差 310 * @param before 311 * @return 312 * @author chenyz 313 */ 314 public static long dayDiffCurr(String before) { 315 Date currDate = DateUtil.stringtoDate(currDay(), LONG_DATE_FORMAT); 316 Date beforeDate = stringtoDate(before, LONG_DATE_FORMAT); 317 return (currDate.getTime() - beforeDate.getTime()) / 86400000; 318 319 } 320 321 /** 322 * 获取每月的第一周 323 * @param year 324 * @param month 325 * @return 326 * @author chenyz 327 */ 328 public static int getFirstWeekdayOfMonth(int year, int month) { 329 Calendar c = Calendar.getInstance(); 330 c.setFirstDayOfWeek(Calendar.SATURDAY); // 星期天为第一天 331 c.set(year, month - 1, 1); 332 return c.get(Calendar.DAY_OF_WEEK); 333 } 334 335 /** 336 * 获取每月的最后一周 337 * @param year 338 * @param month 339 * @return 340 * @author chenyz 341 */ 342 public static int getLastWeekdayOfMonth(int year, int month) { 343 Calendar c = Calendar.getInstance(); 344 c.setFirstDayOfWeek(Calendar.SATURDAY); // 星期天为第一天 345 c.set(year, month - 1, getDaysOfMonth(year, month)); 346 return c.get(Calendar.DAY_OF_WEEK); 347 } 348 349 /** 350 * 获得当前日期字符串,格式"yyyy_MM_dd_HH_mm_ss" 351 * 352 * @return 353 */ 354 public static String getCurrent() { 355 Calendar cal = Calendar.getInstance(); 356 cal.setTime(new Date()); 357 int year = cal.get(Calendar.YEAR); 358 int month = cal.get(Calendar.MONTH) + 1; 359 int day = cal.get(Calendar.DAY_OF_MONTH); 360 int hour = cal.get(Calendar.HOUR_OF_DAY); 361 int minute = cal.get(Calendar.MINUTE); 362 int second = cal.get(Calendar.SECOND); 363 StringBuffer sb = new StringBuffer(); 364 sb.append(year).append("_").append(StringUtil.addzero(month, 2)) 365 .append("_").append(StringUtil.addzero(day, 2)).append("_") 366 .append(StringUtil.addzero(hour, 2)).append("_").append( 367 StringUtil.addzero(minute, 2)).append("_").append( 368 StringUtil.addzero(second, 2)); 369 return sb.toString(); 370 } 371 372 /** 373 * 获得当前日期字符串,格式"yyyy-MM-dd HH:mm:ss" 374 * 375 * @return 376 */ 377 public static String getNow() { 378 Calendar today = Calendar.getInstance(); 379 return dateToString(today.getTime(), FORMAT_ONE); 380 } 381 382 /** 383 * 根据生日获取星座 384 * 385 * @param birth 386 * YYYY-mm-dd 387 * @return 388 */ 389 public static String getAstro(String birth) { 390 if (!isDate(birth)) { 391 birth = "2000" + birth; 392 } 393 if (!isDate(birth)) { 394 return ""; 395 } 396 int month = Integer.parseInt(birth.substring(birth.indexOf("-") + 1, 397 birth.lastIndexOf("-"))); 398 int day = Integer.parseInt(birth.substring(birth.lastIndexOf("-") + 1)); 399 String s = "魔羯水瓶双鱼牡羊金牛双子巨蟹狮子处女天秤天蝎射手魔羯"; 400 int[] arr = { 20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22 }; 401 int start = month * 2 - (day < arr[month - 1] ? 2 : 0); 402 return s.substring(start, start + 2) + "座"; 403 } 404 405 /** 406 * 判断日期是否有效,包括闰年的情况 407 * 408 * @param date 409 * YYYY-mm-dd 410 * @return 411 */ 412 public static boolean isDate(String date) { 413 StringBuffer reg = new StringBuffer( 414 "^((//d{2}(([02468][048])|([13579][26]))-?((((0?"); 415 reg.append("[13578])|(1[02]))-?((0?[1-9])|([1-2][0-9])|(3[01])))"); 416 reg.append("|(((0?[469])|(11))-?((0?[1-9])|([1-2][0-9])|(30)))|"); 417 reg.append("(0?2-?((0?[1-9])|([1-2][0-9])))))|(//d{2}(([02468][12"); 418 reg.append("35679])|([13579][01345789]))-?((((0?[13578])|(1[02]))"); 419 reg.append("-?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))"); 420 reg.append("-?((0?[1-9])|([1-2][0-9])|(30)))|(0?2-?((0?["); 421 reg.append("1-9])|(1[0-9])|(2[0-8]))))))"); 422 Pattern p = Pattern.compile(reg.toString()); 423 return p.matcher(date).matches(); 424 } 425 426 /** 427 * 取得指定日期过 months 月后的日期 (当 months 为负数表示指定月之前); 428 * 429 * @param date 430 * 日期 为null时表示当天 431 * @param month 432 * 相加(相减)的月数 433 */ 434 public static Date nextMonth(Date date, int months) { 435 Calendar cal = Calendar.getInstance(); 436 if (date != null) { 437 cal.setTime(date); 438 } 439 cal.add(Calendar.MONTH, months); 440 return cal.getTime(); 441 } 442 443 /** 444 * 取得指定日期过 day 天后的日期 (当 day 为负数表示指日期之前); 445 * 446 * @param date 447 * 日期 为null时表示当天 448 * @param month 449 * 相加(相减)的月数 450 */ 451 public static Date nextDay(Date date, int day) { 452 Calendar cal = Calendar.getInstance(); 453 if (date != null) { 454 cal.setTime(date); 455 } 456 cal.add(Calendar.DAY_OF_YEAR, day); 457 return cal.getTime(); 458 } 459 460 /** 461 * 取得距离今天 day 日的日期 462 * @param day 463 * @param format 464 * @return 465 * @author chenyz 466 */ 467 public static String nextDay(int day, String format) { 468 Calendar cal = Calendar.getInstance(); 469 cal.setTime(new Date()); 470 cal.add(Calendar.DAY_OF_YEAR, day); 471 return dateToString(cal.getTime(), format); 472 } 473 474 /** 475 * 取得指定日期过 day 周后的日期 (当 day 为负数表示指定月之前) 476 * 477 * @param date 478 * 日期 为null时表示当天 479 */ 480 public static Date nextWeek(Date date, int week) { 481 Calendar cal = Calendar.getInstance(); 482 if (date != null) { 483 cal.setTime(date); 484 } 485 cal.add(Calendar.WEEK_OF_MONTH, week); 486 return cal.getTime(); 487 } 488 489 /** 490 * 获取当前的日期(yyyy-MM-dd) 491 */ 492 public static String currDay() { 493 return DateUtil.dateToString(new Date(), DateUtil.LONG_DATE_FORMAT); 494 } 495 496 /** 497 * 获取昨天的日期 498 * 499 * @return 500 */ 501 public static String befoDay() { 502 return befoDay(DateUtil.LONG_DATE_FORMAT); 503 } 504 505 /** 506 * 根据时间类型获取昨天的日期 507 * @param format 508 * @return 509 * @author chenyz 510 */ 511 public static String befoDay(String format) { 512 return DateUtil.dateToString(DateUtil.nextDay(new Date(), -1), format); 513 } 514 515 /** 516 * 获取明天的日期 517 */ 518 public static String afterDay() { 519 return DateUtil.dateToString(DateUtil.nextDay(new Date(), 1), 520 DateUtil.LONG_DATE_FORMAT); 521 } 522 523 /** 524 * 取得当前时间距离1900/1/1的天数 525 * 526 * @return 527 */ 528 public static int getDayNum() { 529 int daynum = 0; 530 GregorianCalendar gd = new GregorianCalendar(); 531 Date dt = gd.getTime(); 532 GregorianCalendar gd1 = new GregorianCalendar(1900, 1, 1); 533 Date dt1 = gd1.getTime(); 534 daynum = (int) ((dt.getTime() - dt1.getTime()) / (24 * 60 * 60 * 1000)); 535 return daynum; 536 } 537 538 /** 539 * getDayNum的逆方法(用于处理Excel取出的日期格式数据等) 540 * 541 * @param day 542 * @return 543 */ 544 public static Date getDateByNum(int day) { 545 GregorianCalendar gd = new GregorianCalendar(1900, 1, 1); 546 Date date = gd.getTime(); 547 date = nextDay(date, day); 548 return date; 549 } 550 551 /** 针对yyyy-MM-dd HH:mm:ss格式,显示yyyymmdd */ 552 public static String getYmdDateCN(String datestr) { 553 if (datestr == null) 554 return ""; 555 if (datestr.length() < 10) 556 return ""; 557 StringBuffer buf = new StringBuffer(); 558 buf.append(datestr.substring(0, 4)).append(datestr.substring(5, 7)) 559 .append(datestr.substring(8, 10)); 560 return buf.toString(); 561 } 562 563 /** 564 * 获取本月第一天 565 * 566 * @param format 567 * @return 568 */ 569 public static String getFirstDayOfMonth(String format) { 570 Calendar cal = Calendar.getInstance(); 571 cal.set(Calendar.DATE, 1); 572 return dateToString(cal.getTime(), format); 573 } 574 575 /** 576 * 获取本月最后一天 577 * 578 * @param format 579 * @return 580 */ 581 public static String getLastDayOfMonth(String format) { 582 Calendar cal = Calendar.getInstance(); 583 cal.set(Calendar.DATE, 1); 584 cal.add(Calendar.MONTH, 1); 585 cal.add(Calendar.DATE, -1); 586 return dateToString(cal.getTime(), format); 587 } 588 }