1 package util; 2 3 4 import java.text.ParseException; 5 import java.text.SimpleDateFormat; 6 import java.util.Calendar; 7 import java.util.Date; 8 9 import org.apache.commons.lang.StringUtils; 10 import org.apache.commons.logging.Log; 11 import org.apache.commons.logging.LogFactory; 12 13 /** 14 * 日期处理工具类 15 * @author 程欢 16 * 2013-1-11 04:33:50 17 */ 18 public class DateUtil { 19 20 private static final transient Log log = LogFactory.getLog(DateUtil.class); 21 22 /** 23 * 缺省的日期格式 24 */ 25 private static final String DAFAULT_DATE_FORMAT = "yyyy-M-d"; 26 27 private static final String DATE_FORMAT = "yyyy-MM-dd"; 28 29 /** 30 * 默认日期类型格试. 31 * 32 * @see DAFAULT_DATE_FORMAT 33 */ 34 private static SimpleDateFormat dateFormat = new SimpleDateFormat(DAFAULT_DATE_FORMAT); 35 36 /** 37 * 缺省的日期时间格式 38 */ 39 private static final String DAFAULT_DATETIME_FORMAT = "yyyy-M-d HH:mm:ss"; 40 41 /** 42 * 时间格式 43 */ 44 private static String DATETIME_FORMAT = DAFAULT_DATETIME_FORMAT; 45 46 private static SimpleDateFormat datetimeFormat = new SimpleDateFormat(DATETIME_FORMAT); 47 48 /** 49 * 缺省的时间格式 50 */ 51 private static final String DAFAULT_TIME_FORMAT = "HH:mm:ss"; 52 53 /** 54 * 时间格式 55 */ 56 private static String TIME_FORMAT = DAFAULT_TIME_FORMAT; 57 58 private static SimpleDateFormat timeFormat = new SimpleDateFormat(TIME_FORMAT); 59 60 private DateUtil() 61 { 62 // 私用构造主法.因为此类是工具类. 63 } 64 65 /** 66 * 获取格式化实例. 67 * 68 * @param pattern 69 * 如果为空使用DAFAULT_DATE_FORMAT 70 * @return 71 */ 72 public static SimpleDateFormat getFormatInstance(String pattern) { 73 if (pattern == null || pattern.length() == 0) 74 { 75 pattern = DAFAULT_DATE_FORMAT; 76 } 77 return new SimpleDateFormat(pattern); 78 } 79 80 /** 81 * 格式化Calendar 82 * 83 * @param calendar 84 * @return 85 */ 86 public static String formatCalendar(Calendar calendar) { 87 if (calendar == null) 88 { 89 return ""; 90 } 91 return dateFormat.format(calendar.getTime()); 92 } 93 94 public static String formatDateTime(Date d) { 95 if (d == null) 96 { 97 return ""; 98 } 99 return datetimeFormat.format(d); 100 } 101 102 public static String formatDate(Date d) { 103 if (d == null) 104 { 105 return ""; 106 } 107 return dateFormat.format(d); 108 } 109 110 /** 111 * 格式化时间 112 * 113 * @param calendar 114 * @return 115 */ 116 public static String formatTime(Date d) { 117 if (d == null) 118 { 119 return ""; 120 } 121 return timeFormat.format(d); 122 } 123 124 /** 125 * 格式化整数型日期 126 * 127 * @param intDate 128 * @return 129 */ 130 public static String formatIntDate(Integer intDate) { 131 if (intDate == null) 132 { 133 return ""; 134 } 135 Calendar c = newCalendar(intDate); 136 return formatCalendar(c); 137 } 138 139 /** 140 * 根据指定格式化来格式日期. 141 * 142 * @param date 143 * 待格式化的日期. 144 * @param pattern 145 * 格式化样式或分格,如yyMMddHHmmss 146 * @return 字符串型日期. 147 */ 148 public static String formatDate(Date date, String pattern) { 149 if (date == null) 150 { 151 return ""; 152 } 153 if (StringUtils.isBlank(pattern)) 154 { 155 return formatDate(date); 156 } 157 SimpleDateFormat simpleDateFormat = null; 158 try 159 { 160 simpleDateFormat = new SimpleDateFormat(pattern); 161 } catch (Exception e) 162 { 163 e.printStackTrace(); 164 return formatDate(date); 165 } 166 return simpleDateFormat.format(date); 167 } 168 169 /** 170 * 取得Integer型的当前日期 171 * 172 * @return 173 */ 174 public static Integer getIntNow() { 175 return getIntDate(getNow()); 176 } 177 178 /** 179 * 取得Integer型的当前日期 180 * 181 * @return 182 */ 183 public static Integer getIntToday() { 184 return getIntDate(getNow()); 185 } 186 187 /** 188 * 取得Integer型的当前年份 189 * 190 * @return 191 */ 192 public static Integer getIntYearNow() { 193 Calendar c = Calendar.getInstance(); 194 int year = c.get(Calendar.YEAR); 195 return year; 196 } 197 198 /** 199 * 取得Integer型的当前月份 200 * 201 * @return 202 */ 203 public static Integer getIntMonthNow() { 204 Calendar c = Calendar.getInstance(); 205 int month = c.get(Calendar.MONTH) + 1; 206 return month; 207 } 208 209 public static String getStringToday() { 210 return getIntDate(getNow()) + ""; 211 } 212 213 /** 214 * 根据年月日获取整型日期 215 * 216 * @param year 217 * @param month 218 * @param day 219 * @return 220 */ 221 public static Integer getIntDate(int year, int month, int day) { 222 return getIntDate(newCalendar(year, month, day)); 223 } 224 225 /** 226 * 某年月的第一天 227 * 228 * @param year 229 * @param month 230 * @return 231 */ 232 public static Integer getFirstDayOfMonth(int year, int month) { 233 return getIntDate(newCalendar(year, month, 1)); 234 } 235 236 /** 237 * 某年月的第一天 238 * 239 * @param year 240 * @param month 241 * @return 242 */ 243 public static Integer getFirstDayOfThisMonth() { 244 Integer year = DateUtil.getIntYearNow(); 245 Integer month = DateUtil.getIntMonthNow(); 246 return getIntDate(newCalendar(year, month, 1)); 247 } 248 249 /** 250 * 某年月的第一天 251 * 252 * @param date 253 * @return 254 * @time:2008-7-4 上午09:58:55 255 */ 256 public static Integer getFistDayOfMonth(Date date) { 257 Integer intDate = getIntDate(date); 258 int year = intDate / 10000; 259 int month = intDate % 10000 / 100; 260 return getIntDate(newCalendar(year, month, 1)); 261 } 262 263 /** 264 * 某年月的最后一天 265 * 266 * @param year 267 * @param month 268 * @return 269 */ 270 public static Integer getLastDayOfMonth(int year, int month) { 271 return intDateSub(getIntDate(newCalendar(year, month + 1, 1)), 1); 272 } 273 274 /** 275 * 根据Calendar获取整型年份 276 * 277 * @param c 278 * @return 279 */ 280 public static Integer getIntYear(Calendar c) { 281 int year = c.get(Calendar.YEAR); 282 return year; 283 } 284 285 /** 286 * 根据Calendar获取整型日期 287 * 288 * @param c 289 * @return 290 */ 291 public static Integer getIntDate(Calendar c) { 292 int year = c.get(Calendar.YEAR); 293 int month = c.get(Calendar.MONTH) + 1; 294 int day = c.get(Calendar.DAY_OF_MONTH); 295 return year * 10000 + month * 100 + day; 296 } 297 298 /** 299 * 根据Date获取整型年份 300 * 301 * @param d 302 * @return 303 */ 304 public static Integer getIntYear(Date d) { 305 if (d == null) 306 { 307 return null; 308 } 309 Calendar c = Calendar.getInstance(); 310 c.setTime(d); 311 return getIntYear(c); 312 } 313 314 /** 315 * 根据Date获取整型日期 316 * 317 * @param d 318 * @return 319 */ 320 public static Integer getIntDate(Date d) { 321 if (d == null) 322 { 323 return null; 324 } 325 Calendar c = Calendar.getInstance(); 326 c.setTime(d); 327 return getIntDate(c); 328 } 329 330 /** 331 * 根据Integer获取Date日期 332 * 333 * @param n 334 * @return 335 */ 336 public static Date getDate(Integer n) { 337 if (n == null) 338 { 339 return null; 340 } 341 Calendar c = Calendar.getInstance(); 342 c.set(n / 10000, n / 100 % 100 - 1, n % 100); 343 return c.getTime(); 344 } 345 346 public static Date getDate(String date) { 347 if (date == null || date.length() == 0) 348 { 349 return null; 350 } 351 352 try 353 { 354 if (date.contains("/")) 355 { 356 date = date.replaceAll("/", "-"); 357 } 358 return getFormatInstance(DATE_FORMAT).parse(date); 359 } catch (ParseException e) 360 { 361 log.error("解析[" + date + "]错误!", e); 362 return null; 363 } 364 } 365 366 /** 367 * 根据年份Integer获取Date日期 368 * 369 * @param year 370 * @return 371 */ 372 public static Date getFirstDayOfYear(Integer year) { 373 if (year == null) 374 { 375 return null; 376 } 377 Calendar c = Calendar.getInstance(); 378 c.set(year, 1, 1); 379 return c.getTime(); 380 } 381 382 /** 383 * 根据年月日生成Calendar 384 * 385 * @param year 386 * @param month 387 * @param day 388 * @return 389 */ 390 public static Calendar newCalendar(int year, int month, int day) { 391 Calendar ret = Calendar.getInstance(); 392 if (year < 100) 393 { 394 year = 2000 + year; 395 } 396 ret.set(year, month - 1, day); 397 return ret; 398 } 399 400 /** 401 * 根据整型日期生成Calendar 402 * 403 * @param date 404 * @return 405 */ 406 public static Calendar newCalendar(int date) { 407 int year = date / 10000; 408 int month = (date % 10000) / 100; 409 int day = date % 100; 410 411 Calendar ret = Calendar.getInstance(); 412 ret.set(year, month - 1, day); 413 return ret; 414 } 415 416 /** 417 * 取得Date型的当前日期 418 * 419 * @return 420 */ 421 public static Date getNow() { 422 return new Date(); 423 } 424 425 /** 426 * 取得Date型的当前日期 427 * 428 * @return 429 */ 430 public static Date getToday() { 431 return DateUtil.getDate(DateUtil.getIntToday()); 432 } 433 434 /** 435 * 整数型日期的加法 436 * 437 * @param date 438 * @param days 439 * @return 440 */ 441 public static Integer intDateAdd(int date, int days) { 442 int year = date / 10000; 443 int month = (date % 10000) / 100; 444 int day = date % 100; 445 446 day += days; 447 448 return getIntDate(year, month, day); 449 } 450 451 /** 452 * 整数型日期的减法 453 * 454 * @param date 455 * @param days 456 * @return 457 */ 458 public static Integer intDateSub(int date, int days) { 459 return intDateAdd(date, -days); 460 } 461 462 /** 463 * 计算两个整型日期之间的天数 464 * 465 * @param startDate 466 * @param endDate 467 * @return 468 */ 469 public static Integer daysBetweenDate(Integer startDate, Integer endDate) { 470 if (startDate == null || endDate == null) 471 { 472 return null; 473 } 474 Calendar c1 = newCalendar(startDate); 475 Calendar c2 = newCalendar(endDate); 476 477 Long lg = (c2.getTimeInMillis() - c1.getTimeInMillis()) / 1000 / 60 / 60 / 24; 478 return lg.intValue(); 479 } 480 481 /** 482 * 计算两个整型日期之间的天数 483 * 484 * @param startDate 485 * @param endDate 486 * @return 487 */ 488 public static Integer daysBetweenDate(Date startDate, Date endDate) { 489 if (startDate == null || endDate == null) 490 { 491 return null; 492 } 493 Long interval = endDate.getTime() - startDate.getTime(); 494 interval = interval / (24 * 60 * 60 * 1000); 495 return interval.intValue(); 496 } 497 498 /** 499 * 取得当前日期. 500 * 501 * @return 当前日期,字符串类型. 502 */ 503 public static String getStringDate() { 504 return getStringDate(DateUtil.getNow()); 505 } 506 507 /** 508 * 根据calendar产生字符串型日期 509 * 510 * @param d 511 * @return eg:20080707 512 */ 513 public static String getStringDate(Date d) { 514 if (d == null) 515 { 516 return ""; 517 } 518 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); 519 return sdf.format(d); 520 } 521 522 public static String getFormatStringDate(Date d) { 523 if (d == null) 524 { 525 return ""; 526 } 527 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); 528 return sdf.format(d); 529 } 530 // /** 531 // * 国际化。 532 // */ 533 // public static String formatI18nDate(Date date){ 534 // if(date == null){ 535 // return ""; 536 // } 537 // ActionSupport actionSupport = new ActionSupport(); 538 // SimpleDateFormat sdf = new 539 // SimpleDateFormat(actionSupport.getText("date.i18n.format")); 540 // return sdf.format(date); 541 // } 542 543 }