1 public class AbDateUtil { 2 3 /** 时间日期格式化到年月日时分秒. */ 4 public static final String dateFormatYMDHMS = "yyyy-MM-dd HH:mm:ss"; 5 6 /** 时间日期格式化到年月日. */ 7 public static final String dateFormatYMD = "yyyy-MM-dd"; 8 9 /** 时间日期格式化到年月. */ 10 public static final String dateFormatYM = "yyyy-MM"; 11 12 /** 时间日期格式化到年月日时分. */ 13 public static final String dateFormatYMDHM = "yyyy-MM-dd HH:mm"; 14 15 /** 时间日期格式化到月日. */ 16 public static final String dateFormatMD = "MM/dd"; 17 18 /** 时分秒. */ 19 public static final String dateFormatHMS = "HH:mm:ss"; 20 21 /** 时分. */ 22 public static final String dateFormatHM = "HH:mm"; 23 24 /** 上午. */ 25 public static final String AM = "AM"; 26 27 /** 下午. */ 28 public static final String PM = "PM"; 29 30 31 /** 32 * 描述:String类型的日期时间转化为Date类型. 33 * 34 * @param strDate String形式的日期时间 35 * @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" 36 * @return Date Date类型日期时间 37 */ 38 public static Date getDateByFormat(String strDate, String format) { 39 SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); 40 Date date = null; 41 try { 42 date = mSimpleDateFormat.parse(strDate); 43 } catch (ParseException e) { 44 e.printStackTrace(); 45 } 46 return date; 47 } 48 49 /** 50 * 描述:获取偏移之后的Date. 51 * @param date 日期时间 52 * @param calendarField Calendar属性,对应offset的值, 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示+offset小时) 53 * @param offset 偏移(值大于0,表示+,值小于0,表示-) 54 * @return Date 偏移之后的日期时间 55 */ 56 public Date getDateByOffset(Date date,int calendarField,int offset) { 57 Calendar c = new GregorianCalendar(); 58 try { 59 c.setTime(date); 60 c.add(calendarField, offset); 61 } catch (Exception e) { 62 e.printStackTrace(); 63 } 64 return c.getTime(); 65 } 66 67 /** 68 * 描述:获取指定日期时间的字符串(可偏移). 69 * 70 * @param strDate String形式的日期时间 71 * @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" 72 * @param calendarField Calendar属性,对应offset的值, 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示+offset小时) 73 * @param offset 偏移(值大于0,表示+,值小于0,表示-) 74 * @return String String类型的日期时间 75 */ 76 public static String getStringByOffset(String strDate, String format,int calendarField,int offset) { 77 String mDateTime = null; 78 try { 79 Calendar c = new GregorianCalendar(); 80 SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); 81 c.setTime(mSimpleDateFormat.parse(strDate)); 82 c.add(calendarField, offset); 83 mDateTime = mSimpleDateFormat.format(c.getTime()); 84 } catch (ParseException e) { 85 e.printStackTrace(); 86 } 87 return mDateTime; 88 } 89 90 /** 91 * 描述:Date类型转化为String类型(可偏移). 92 * 93 * @param date the date 94 * @param format the format 95 * @param calendarField the calendar field 96 * @param offset the offset 97 * @return String String类型日期时间 98 */ 99 public static String getStringByOffset(Date date, String format,int calendarField,int offset) { 100 String strDate = null; 101 try { 102 Calendar c = new GregorianCalendar(); 103 SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); 104 c.setTime(date); 105 c.add(calendarField, offset); 106 strDate = mSimpleDateFormat.format(c.getTime()); 107 } catch (Exception e) { 108 e.printStackTrace(); 109 } 110 return strDate; 111 } 112 113 114 /** 115 * 描述:Date类型转化为String类型. 116 * 117 * @param date the date 118 * @param format the format 119 * @return String String类型日期时间 120 */ 121 public static String getStringByFormat(Date date, String format) { 122 SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); 123 String strDate = null; 124 try { 125 strDate = mSimpleDateFormat.format(date); 126 } catch (Exception e) { 127 e.printStackTrace(); 128 } 129 return strDate; 130 } 131 132 /** 133 * 描述:获取指定日期时间的字符串,用于导出想要的格式. 134 * 135 * @param strDate String形式的日期时间,必须为yyyy-MM-dd HH:mm:ss格式 136 * @param format 输出格式化字符串,如:"yyyy-MM-dd HH:mm:ss" 137 * @return String 转换后的String类型的日期时间 138 */ 139 public static String getStringByFormat(String strDate, String format) { 140 String mDateTime = null; 141 try { 142 Calendar c = new GregorianCalendar(); 143 SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(dateFormatYMDHMS); 144 c.setTime(mSimpleDateFormat.parse(strDate)); 145 SimpleDateFormat mSimpleDateFormat2 = new SimpleDateFormat(format); 146 mDateTime = mSimpleDateFormat2.format(c.getTime()); 147 } catch (Exception e) { 148 e.printStackTrace(); 149 } 150 return mDateTime; 151 } 152 153 /** 154 * 描述:获取milliseconds表示的日期时间的字符串. 155 * 156 * @param milliseconds the milliseconds 157 * @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" 158 * @return String 日期时间字符串 159 */ 160 public static String getStringByFormat(long milliseconds,String format) { 161 String thisDateTime = null; 162 try { 163 SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); 164 thisDateTime = mSimpleDateFormat.format(milliseconds); 165 } catch (Exception e) { 166 e.printStackTrace(); 167 } 168 return thisDateTime; 169 } 170 171 /** 172 * 描述:获取表示当前日期时间的字符串. 173 * 174 * @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" 175 * @return String String类型的当前日期时间 176 */ 177 public static String getCurrentDate(String format) { 178 AbLogUtil.d(AbDateUtil.class, "getCurrentDate:"+format); 179 String curDateTime = null; 180 try { 181 SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); 182 Calendar c = new GregorianCalendar(); 183 curDateTime = mSimpleDateFormat.format(c.getTime()); 184 } catch (Exception e) { 185 e.printStackTrace(); 186 } 187 return curDateTime; 188 189 } 190 191 /** 192 * 描述:获取表示当前日期时间的字符串(可偏移). 193 * 194 * @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" 195 * @param calendarField Calendar属性,对应offset的值, 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示+offset小时) 196 * @param offset 偏移(值大于0,表示+,值小于0,表示-) 197 * @return String String类型的日期时间 198 */ 199 public static String getCurrentDateByOffset(String format,int calendarField,int offset) { 200 String mDateTime = null; 201 try { 202 SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); 203 Calendar c = new GregorianCalendar(); 204 c.add(calendarField, offset); 205 mDateTime = mSimpleDateFormat.format(c.getTime()); 206 } catch (Exception e) { 207 e.printStackTrace(); 208 } 209 return mDateTime; 210 211 } 212 213 /** 214 * 描述:计算两个日期所差的天数. 215 * 216 * @param milliseconds1 the milliseconds1 217 * @param milliseconds2 the milliseconds2 218 * @return int 所差的天数 219 */ 220 public static int getOffectDay(long milliseconds1, long milliseconds2) { 221 Calendar calendar1 = Calendar.getInstance(); 222 calendar1.setTimeInMillis(milliseconds1); 223 Calendar calendar2 = Calendar.getInstance(); 224 calendar2.setTimeInMillis(milliseconds2); 225 //先判断是否同年 226 int y1 = calendar1.get(Calendar.YEAR); 227 int y2 = calendar2.get(Calendar.YEAR); 228 int d1 = calendar1.get(Calendar.DAY_OF_YEAR); 229 int d2 = calendar2.get(Calendar.DAY_OF_YEAR); 230 int maxDays = 0; 231 int day = 0; 232 if (y1 - y2 > 0) { 233 maxDays = calendar2.getActualMaximum(Calendar.DAY_OF_YEAR); 234 day = d1 - d2 + maxDays; 235 } else if (y1 - y2 < 0) { 236 maxDays = calendar1.getActualMaximum(Calendar.DAY_OF_YEAR); 237 day = d1 - d2 - maxDays; 238 } else { 239 day = d1 - d2; 240 } 241 return day; 242 } 243 244 /** 245 * 描述:计算两个日期所差的小时数. 246 * 247 * @param date1 第一个时间的毫秒表示 248 * @param date2 第二个时间的毫秒表示 249 * @return int 所差的小时数 250 */ 251 public static int getOffectHour(long date1, long date2) { 252 Calendar calendar1 = Calendar.getInstance(); 253 calendar1.setTimeInMillis(date1); 254 Calendar calendar2 = Calendar.getInstance(); 255 calendar2.setTimeInMillis(date2); 256 int h1 = calendar1.get(Calendar.HOUR_OF_DAY); 257 int h2 = calendar2.get(Calendar.HOUR_OF_DAY); 258 int h = 0; 259 int day = getOffectDay(date1, date2); 260 h = h1-h2+day*24; 261 return h; 262 } 263 264 /** 265 * 描述:计算两个日期所差的分钟数. 266 * 267 * @param date1 第一个时间的毫秒表示 268 * @param date2 第二个时间的毫秒表示 269 * @return int 所差的分钟数 270 */ 271 public static int getOffectMinutes(long date1, long date2) { 272 Calendar calendar1 = Calendar.getInstance(); 273 calendar1.setTimeInMillis(date1); 274 Calendar calendar2 = Calendar.getInstance(); 275 calendar2.setTimeInMillis(date2); 276 int m1 = calendar1.get(Calendar.MINUTE); 277 int m2 = calendar2.get(Calendar.MINUTE); 278 int h = getOffectHour(date1, date2); 279 int m = 0; 280 m = m1-m2+h*60; 281 return m; 282 } 283 284 /** 285 * 描述:获取本周一. 286 * 287 * @param format the format 288 * @return String String类型日期时间 289 */ 290 public static String getFirstDayOfWeek(String format) { 291 return getDayOfWeek(format,Calendar.MONDAY); 292 } 293 294 /** 295 * 描述:获取本周日. 296 * 297 * @param format the format 298 * @return String String类型日期时间 299 */ 300 public static String getLastDayOfWeek(String format) { 301 return getDayOfWeek(format,Calendar.SUNDAY); 302 } 303 304 /** 305 * 描述:获取本周的某一天. 306 * 307 * @param format the format 308 * @param calendarField the calendar field 309 * @return String String类型日期时间 310 */ 311 private static String getDayOfWeek(String format,int calendarField) { 312 String strDate = null; 313 try { 314 Calendar c = new GregorianCalendar(); 315 SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); 316 int week = c.get(Calendar.DAY_OF_WEEK); 317 if (week == calendarField){ 318 strDate = mSimpleDateFormat.format(c.getTime()); 319 }else{ 320 int offectDay = calendarField - week; 321 if (calendarField == Calendar.SUNDAY) { 322 offectDay = 7-Math.abs(offectDay); 323 } 324 c.add(Calendar.DATE, offectDay); 325 strDate = mSimpleDateFormat.format(c.getTime()); 326 } 327 } catch (Exception e) { 328 e.printStackTrace(); 329 } 330 return strDate; 331 } 332 333 /** 334 * 描述:获取本月第一天. 335 * 336 * @param format the format 337 * @return String String类型日期时间 338 */ 339 public static String getFirstDayOfMonth(String format) { 340 String strDate = null; 341 try { 342 Calendar c = new GregorianCalendar(); 343 SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); 344 //当前月的第一天 345 c.set(GregorianCalendar.DAY_OF_MONTH, 1); 346 strDate = mSimpleDateFormat.format(c.getTime()); 347 } catch (Exception e) { 348 e.printStackTrace(); 349 } 350 return strDate; 351 352 } 353 354 /** 355 * 描述:获取本月最后一天. 356 * 357 * @param format the format 358 * @return String String类型日期时间 359 */ 360 public static String getLastDayOfMonth(String format) { 361 String strDate = null; 362 try { 363 Calendar c = new GregorianCalendar(); 364 SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); 365 // 当前月的最后一天 366 c.set(Calendar.DATE, 1); 367 c.roll(Calendar.DATE, -1); 368 strDate = mSimpleDateFormat.format(c.getTime()); 369 } catch (Exception e) { 370 e.printStackTrace(); 371 } 372 return strDate; 373 } 374 375 376 377 /** 378 * 描述:获取表示当前日期的0点时间毫秒数. 379 * 380 * @return the first time of day 381 */ 382 public static long getFirstTimeOfDay() { 383 Date date = null; 384 try { 385 String currentDate = getCurrentDate(dateFormatYMD); 386 date = getDateByFormat(currentDate+" 00:00:00",dateFormatYMDHMS); 387 return date.getTime(); 388 } catch (Exception e) { 389 } 390 return -1; 391 } 392 393 /** 394 * 描述:获取表示当前日期24点时间毫秒数. 395 * 396 * @return the last time of day 397 */ 398 public static long getLastTimeOfDay() { 399 Date date = null; 400 try { 401 String currentDate = getCurrentDate(dateFormatYMD); 402 date = getDateByFormat(currentDate+" 24:00:00",dateFormatYMDHMS); 403 return date.getTime(); 404 } catch (Exception e) { 405 } 406 return -1; 407 } 408 409 /** 410 * 描述:判断是否是闰年() 411 * <p>(year能被4整除 并且 不能被100整除) 或者 year能被400整除,则该年为闰年. 412 * 413 * @param year 年代(如2012) 414 * @return boolean 是否为闰年 415 */ 416 public static boolean isLeapYear(int year) { 417 if ((year % 4 == 0 && year % 400 != 0) || year % 400 == 0) { 418 return true; 419 } else { 420 return false; 421 } 422 } 423 424 /** 425 * 描述:根据时间返回格式化后的时间的描述. 426 * 小于1小时显示多少分钟前 大于1小时显示今天+实际日期,大于今天全部显示实际时间 427 * 428 * @param strDate the str date 429 * @param outFormat the out format 430 * @return the string 431 */ 432 public static String formatDateStr2Desc(String strDate,String outFormat) { 433 434 DateFormat df = new SimpleDateFormat(dateFormatYMDHMS); 435 Calendar c1 = Calendar.getInstance(); 436 Calendar c2 = Calendar.getInstance(); 437 try { 438 c2.setTime(df.parse(strDate)); 439 c1.setTime(new Date()); 440 int d = getOffectDay(c1.getTimeInMillis(), c2.getTimeInMillis()); 441 if(d==0){ 442 int h = getOffectHour(c1.getTimeInMillis(), c2.getTimeInMillis()); 443 if(h>0){ 444 return "今天"+getStringByFormat(strDate,dateFormatHM); 445 //return h + "小时前"; 446 }else if(h<0){ 447 //return Math.abs(h) + "小时后"; 448 }else if(h==0){ 449 int m = getOffectMinutes(c1.getTimeInMillis(), c2.getTimeInMillis()); 450 if(m>0){ 451 return m + "分钟前"; 452 }else if(m<0){ 453 //return Math.abs(m) + "分钟后"; 454 }else{ 455 return "刚刚"; 456 } 457 } 458 459 }else if(d>0){ 460 if(d == 1){ 461 //return "昨天"+getStringByFormat(strDate,outFormat); 462 }else if(d==2){ 463 //return "前天"+getStringByFormat(strDate,outFormat); 464 } 465 }else if(d<0){ 466 if(d == -1){ 467 //return "明天"+getStringByFormat(strDate,outFormat); 468 }else if(d== -2){ 469 //return "后天"+getStringByFormat(strDate,outFormat); 470 }else{ 471 //return Math.abs(d) + "天后"+getStringByFormat(strDate,outFormat); 472 } 473 } 474 475 String out = getStringByFormat(strDate,outFormat); 476 if(!AbStrUtil.isEmpty(out)){ 477 return out; 478 } 479 } catch (Exception e) { 480 } 481 482 return strDate; 483 } 484 485 486 /** 487 * 取指定日期为星期几. 488 * 489 * @param strDate 指定日期 490 * @param inFormat 指定日期格式 491 * @return String 星期几 492 */ 493 public static String getWeekNumber(String strDate,String inFormat) { 494 String week = "星期日"; 495 Calendar calendar = new GregorianCalendar(); 496 DateFormat df = new SimpleDateFormat(inFormat); 497 try { 498 calendar.setTime(df.parse(strDate)); 499 } catch (Exception e) { 500 return "错误"; 501 } 502 int intTemp = calendar.get(Calendar.DAY_OF_WEEK) - 1; 503 switch (intTemp){ 504 case 0: 505 week = "星期日"; 506 break; 507 case 1: 508 week = "星期一"; 509 break; 510 case 2: 511 week = "星期二"; 512 break; 513 case 3: 514 week = "星期三"; 515 break; 516 case 4: 517 week = "星期四"; 518 break; 519 case 5: 520 week = "星期五"; 521 break; 522 case 6: 523 week = "星期六"; 524 break; 525 } 526 return week; 527 } 528 529 /** 530 * 根据给定的日期判断是否为上下午. 531 * 532 * @param strDate the str date 533 * @param format the format 534 * @return the time quantum 535 */ 536 public static String getTimeQuantum(String strDate, String format) { 537 Date mDate = getDateByFormat(strDate, format); 538 int hour = mDate.getHours(); 539 if(hour >=12) 540 return "PM"; 541 else 542 return "AM"; 543 } 544 545 /** 546 * 根据给定的毫秒数算得时间的描述. 547 * 548 * @param milliseconds the milliseconds 549 * @return the time description 550 */ 551 public static String getTimeDescription(long milliseconds) { 552 if(milliseconds > 1000){ 553 //大于一分 554 if(milliseconds/1000/60>1){ 555 long minute = milliseconds/1000/60; 556 long second = milliseconds/1000%60; 557 return minute+"分"+second+"秒"; 558 }else{ 559 //显示秒 560 return milliseconds/1000+"秒"; 561 } 562 }else{ 563 return milliseconds+"毫秒"; 564 } 565 } 566 567 /** 568 * The main method. 569 * 570 * @param args the arguments 571 */ 572 public static void main(String[] args) { 573 System.out.println(formatDateStr2Desc("2012-3-2 12:2:20","MM月dd日 HH:mm")); 574 } 575 576 }