/** * ======================================================== * 北京五八信息技术有限公司技术中心开发一部 * 日 期:2011-3-14 上午10:16:22 * 作 者:张纪豪 * 版 本:1.0.0 * ======================================================== * 修订日期 修订人 描述 * */ package org.howsun.util; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.concurrent.TimeUnit; /** * <h1>功能描述:</h1> * * @author howsun(howsun.zhang@google.com) * @version 1.0.0 */ public abstract class Dates { /** * @deprecated 未考虑线程安全 */ public final static SimpleDateFormat TIMESTAMP_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * @deprecated 未考虑线程安全 */ public final static SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd"); /** * @deprecated 未考虑线程安全 */ public final static SimpleDateFormat TIME_FORMATTER = new SimpleDateFormat("HH:mm:ss"); /*** * 线程安全的时间格式化工具 */ private static final ThreadLocal<SimpleDateFormat> TIMESTAMP_FORMATER = new ThreadLocal<SimpleDateFormat>(); /** * @param date * @return 返回yyyy-MM-dd HH:mm:ss SSS格式的时间 */ public static String getDateFormated_yyyyMMddHHmmssSSS(Date date){ return getDateFormated("yyyy-MM-dd HH:mm:ss SSS", date); } /** * @param date * @return 返回yyyy-MM-dd HH:mm:ss格式的时间 */ public static String getDateFormated_yyyyMMddHHmmss(Date date){ return getDateFormated("yyyy-MM-dd HH:mm:ss", date); } /** * @param date * @return 返回yyyy-MM-dd格式的时间 */ public static String getDateFormated_yyyyMMdd(Date date){ return getDateFormated("yyyy-MM-dd", date); } /** * @param date * @return 返回HH:mm:ss格式的时间 */ public static String getDateFormated_HHmmss(Date date){ return getDateFormated("HH:mm:ss", date); } /** * 通用日期格式化方法,考虑到线程安全问题 * @param pattren * @param date * @return */ public static String getDateFormated(String pattern, Date date){ SimpleDateFormat formater = TIMESTAMP_FORMATER.get(); if(formater == null){ formater = new SimpleDateFormat(pattern); TIMESTAMP_FORMATER.set(formater); } else if(!pattern.equals(formater.toPattern())){ formater.applyPattern(pattern); } return formater.format(date); } /** * 把字节数组中时分秒转换成以秒为单位的整数 * * @param times * @return */ public static int HHmmssBytes2second(byte[] times){ int length = times.length - 1; int ret = 0; for (int i = 0; i <= length ; i++) { ret += ((times[i] < 0) ? 60 + times[i] : times[i]) * Math.pow(60, length - i); } return ret; } /** * 时:分:秒 格式的字符串转换成整数秒 * @param time * @return */ public static int HHmmssString2secoend(String onlyTime){ Date date = null; try { date = TIME_FORMATTER.parse(onlyTime); return getSecoendInIntraday(date); } catch (Exception e) {e.printStackTrace();} return -1; } /** * 将秒数转换成数组 * @param time * @return */ public static byte[] secoends2HHmmssBytes(int secoends){ byte[] ts = new byte[3]; try { ts[0] = (byte)(secoends / 3600); ts[1] = (byte)(secoends % 3600 / 60); ts[2] = (byte)(secoends % 3600 % 60); } catch (Exception e) {e.printStackTrace();} return ts; } /** * 获取今天当前的秒数 * @return */ public static int getSecoendInIntraday(){ return getSecoendInIntraday(Calendar.getInstance(Locale.CHINA)); } /** * 获取某天至现在的秒数 * @param calendar * @return */ public static int getSecoendInIntraday(Calendar calendar){ if(calendar == null) calendar = Calendar.getInstance(); return (int)( ( calendar.getTimeInMillis() - getSecoendOfBegin(calendar, Calendar.DATE) ) / 1000 ); } /** * 获取某年的秒数 * @param calendar * @return */ public static int getSecoendInThisYear(Calendar calendar){ if(calendar == null) calendar = Calendar.getInstance(); return (int)( ( calendar.getTimeInMillis() - getSecoendOfBegin(calendar, Calendar.YEAR) ) / 1000 ); } /** * 获取当天当前的秒数 * @param date * @return */ public static int getSecoendInIntraday(Date date){ Calendar cal = Calendar.getInstance(); cal.setTime(date); return getSecoendInIntraday(cal); } /** * 获取某年的秒数 * @param calendar * @return */ public static int getSecoendInThisYear(){ Calendar calendar = Calendar.getInstance(); return (int)( ( calendar.getTimeInMillis() - getSecoendOfBegin(calendar, Calendar.YEAR) ) / 1000 ); } /** * 获取某时间的开始毫秒数 * * @param calendar 时间 * @param calendarField 类型,只支持年开始的秒数,月开始的秒数,日开始的秒数,小时开始的秒数,分钟开始的秒数 * @return 毫秒数 */ public static long getSecoendOfBegin(Calendar calendar, int calendarField){ Calendar cal = calendar == null ? Calendar.getInstance() : (Calendar)calendar.clone(); cal.set(Calendar.AM_PM, 0); switch (calendarField) { case Calendar.YEAR: cal.set(cal.get(Calendar.YEAR), 0, 1, 0, 0, 0); break; case Calendar.MONTH: cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 1, 0, 0, 0); break; case Calendar.DATE: cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), 0, 0, 0); break; case Calendar.HOUR: cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), cal.get(Calendar.HOUR), 0, 0); break; case Calendar.MINUTE: cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE), 0); break; default: throw new RuntimeException("不支持的时间模式。"); } cal.set(Calendar.MILLISECOND, 0); return cal.getTimeInMillis(); } /** * 获取参数1指定时间类型的开始毫秒数 * 例如今天最开始的秒数为getSecoendOfBegin(Calendar.DATE) * @param calendarField * @return 毫秒数 */ public static long getSecoendOfBegin(int calendarField){ return getSecoendOfBegin(null, calendarField); } /** * 获取今天字符串格式的日期 * @param formatter * @return */ public static String getDateString(SimpleDateFormat formatter){ return formatter.format(new Date()); } public static String getDate(Calendar time, String format){ if(time == null) return ""; StringBuffer sb = new StringBuffer(); try { sb.append(new SimpleDateFormat(format).format(time.getTime())); } catch (Exception e) { sb.append(new SimpleDateFormat("yyyy-MM-dd").format(time.getTime())); } return sb.toString(); } public static String getDate(Calendar time){ return getDate(time,"yyyy-MM-dd"); } @Deprecated public static void setCalendar(Calendar time, int field, int amount){ if(time == null) time = Calendar.getInstance(Locale.CHINA); time.add(field, amount); //return time; } public static Calendar cloneCalendar(Calendar time, int field, int amount){ Calendar newTime = time== null ? Calendar.getInstance(Locale.CHINA) : (Calendar)time.clone(); newTime.add(field, amount); return newTime; } /** * 今天以后的日期离今天还剩的天数 * @param oldTime * @return */ public static long amountLeaveAfter(Calendar oldTime){ Calendar newTime = Calendar.getInstance(); return ( oldTime.getTimeInMillis() - newTime.getTimeInMillis() ) / 1000 / 60 / 60 / 24; } /** * 今天以前的日期离今天还剩的天数 * @param oldTime * @return */ public static long amountLeaveBefore(Calendar oldTime){ Calendar newTime = Calendar.getInstance(); return (newTime.getTimeInMillis()-oldTime.getTimeInMillis())/1000/60/60/24; } /** * * @param date * @param second * @return */ public static Date getDateByOffset(Date date, int amount, TimeUnit timeUnit){ Calendar calendar = Calendar.getInstance(); calendar.setTime(date); switch (timeUnit) { case DAYS: calendar.add(Calendar.DATE, amount); break; case HOURS: calendar.add(Calendar.HOUR, amount); break; case MINUTES: calendar.add(Calendar.MINUTE, amount); break; case SECONDS: calendar.add(Calendar.SECOND, amount); break; case MILLISECONDS: calendar.add(Calendar.MILLISECOND, amount); break; default: break; } return calendar.getTime(); } /** * 求真实年龄 * @param birthDay * @return * @throws Exception */ public static int getAge(Date birthDay){ Calendar cal = Calendar.getInstance(); if (cal.before(birthDay)) { throw new IllegalArgumentException( "The birthDay is before Now.It's unbelievable!"); } int yearNow = cal.get(Calendar.YEAR); int monthNow = cal.get(Calendar.MONTH); int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH); cal.setTime(birthDay); int yearBirth = cal.get(Calendar.YEAR); int monthBirth = cal.get(Calendar.MONTH); int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH); int age = yearNow - yearBirth; if (monthNow <= monthBirth) { if (monthNow == monthBirth) { //monthNow==monthBirth if (dayOfMonthNow < dayOfMonthBirth) { age--; } else { //do nothing } } else { //monthNow>monthBirth age--; } } else { //monthNow<monthBirth //donothing } return age; } public static boolean isToday(Calendar date){ Calendar today = Calendar.getInstance(); date.setFirstDayOfWeek(Calendar.MONDAY); today.setFirstDayOfWeek(Calendar.MONDAY); return date.get(Calendar.YEAR) == today.get(Calendar.YEAR) && date.get(Calendar.MONTH) == today.get(Calendar.MONTH) && date.get(Calendar.DATE) == today.get(Calendar.DATE); } public static boolean isThisWeek(Calendar date){ Calendar today = Calendar.getInstance(); date.setFirstDayOfWeek(Calendar.MONDAY); today.setFirstDayOfWeek(Calendar.MONDAY); return date.get(Calendar.YEAR) == today.get(Calendar.YEAR) && date.get(Calendar.WEEK_OF_YEAR) == today.get(Calendar.WEEK_OF_YEAR); } public static boolean isThisMonth(Calendar date){ Calendar today = Calendar.getInstance(); date.setFirstDayOfWeek(Calendar.MONDAY); today.setFirstDayOfWeek(Calendar.MONDAY); return date.get(Calendar.YEAR) == today.get(Calendar.YEAR) && date.get(Calendar.MONTH) == today.get(Calendar.MONTH); } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { Date d = new SimpleDateFormat("yyyy-MM-dd").parse("1976-11-21"); System.out.println(getAge(d)); } }