package org.theonefx.wcframework.utils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; import java.util.Vector; /** * @Package cn.nzit.observersp.common.util * @ClassName: DateUtils * @author 陈曦 * @date 2011-01-12 05:47:38 * @Description: 时间日期工具类 */ public class DateUtils { // 日期格式,年份,例如:2004,2008 public static final String DATE_FORMAT_YYYY = "yyyy"; // 日期格式,年份和月份,例如:200707,200808 public static final String DATE_FORMAT_YYYYMM = "yyyyMM"; // 日期格式,年月日,例如:20050630,20080808 public static final String DATE_FORMAT_YYYYMMDD = "yyyyMMdd"; // 日期格式,年月日,用横杠分开,例如:2006-12-25,2008-08-08 public static final String DATE_FORMAT_YYYY_MM_DD = "yyyy-MM-dd"; // 日期格式,年月日时分秒,例如:20001230120000,20080808200808 public static final String DATE_TIME_FORMAT_YYYYMMDDHHMISS = "yyyyMMddHHmmss"; // 日期格式,年月日时分秒,年月日用横杠分开,时分秒用冒号分开, // 例如:2005-05-10 23:20:00,2008-08-08 20:08:08 public static final String DATE_TIME_FORMAT_YYYY_MM_DD_HH_MI_SS1 = "yyyy-MM-dd HH:mm:ss"; // 日期格式,年月日时分秒,年月日用横杠分开,时分秒用冒号分开, // 例如:2005-05-10 23:20:00,2008-08-08 20:08:08 public static final String DATE_TIME_FORMAT_YYYY_MM_DD_HH_MI_SS2 = "yyyy/MM/dd HH:mm:ss"; private static ThreadLocal<SimpleDateFormat> dateFormaterLocal = new ThreadLocal<SimpleDateFormat>(); private static ThreadLocal<SimpleDateFormat> dateTimeFormaterLocal = new ThreadLocal<SimpleDateFormat>(); public static Date smartConvert(String str) { SimpleDateFormat formater = new SimpleDateFormat(DATE_TIME_FORMAT_YYYY_MM_DD_HH_MI_SS1); try { return formater.parse(str); } catch (ParseException e) { formater = new SimpleDateFormat(DATE_TIME_FORMAT_YYYY_MM_DD_HH_MI_SS2); try { return formater.parse(str); } catch (ParseException e1) { formater = new SimpleDateFormat(DATE_TIME_FORMAT_YYYYMMDDHHMISS); try { return formater.parse(str); } catch (ParseException e2) { formater = new SimpleDateFormat(DATE_FORMAT_YYYY_MM_DD); try { return formater.parse(str); } catch (ParseException e3) { formater = new SimpleDateFormat(DATE_FORMAT_YYYYMMDD); try { return formater.parse(str); } catch (ParseException e4) { return null; } } } } } } private static SimpleDateFormat getDateFormater() { SimpleDateFormat formater = dateFormaterLocal.get(); if (formater == null) { formater = new SimpleDateFormat("yyyy-MM-dd"); dateFormaterLocal.set(formater); } return formater; } private static SimpleDateFormat getDateTimeFormater() { SimpleDateFormat formater = dateTimeFormaterLocal.get(); if (formater == null) { formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateTimeFormaterLocal.set(formater); } return formater; } public static Date formatDate(String date) { Date fdate = null; try { fdate = getDateFormater().parse(date); } catch (ParseException e) { fdate = null; } return fdate; } public static String formatDate(Date date) { if (date == null) return ""; return getDateFormater().format(date); } public static String formatDateTime(Date date) { if (date == null) return ""; return getDateTimeFormater().format(date); } public static Date formatDateTime(String date) { Date fdate = null; try { fdate = getDateTimeFormater().parse(date); } catch (ParseException e) { e.printStackTrace(); fdate = null; } return fdate; } public static Date format(String date, String format) { Date fdate = null; try { SimpleDateFormat formater = new SimpleDateFormat(format); fdate = formater.parse(date); } catch (ParseException e) { fdate = null; } return fdate; } public static String getFormatedNow(String format){ Date now = new Date(); if(StringUtils.isNotEmpty(format)){ return format(now, format); }else{ return formatDateTime(now); } } public static String getFormatedNow(){ return getFormatedNow(null); } /** * 对日期(时间)中的日进行加减计算. <br> * 例子: <br> * 如果Date类型的d为 2005年8月20日,那么 <br> * calculateByDate(d,-10)的值为2005年8月10日 <br> * 而calculateByDate(d,+10)的值为2005年8月30日 <br> * * @param d * 日期(时间). * @param amount * 加减计算的幅度.+n=加n天;-n=减n天. * @return 计算后的日期(时间). */ public static Date calculateByDate(Date d, int amount) { return calculate(d, GregorianCalendar.DATE, amount); } public static Date calculateByMinute(Date d, int amount) { return calculate(d, GregorianCalendar.MINUTE, amount); } public static Date calculateByYear(Date d, int amount) { return calculate(d, GregorianCalendar.YEAR, amount); } /** * 对日期(时间)中由field参数指定的日期成员进行加减计算. <br> * 例子: <br> * 如果Date类型的d为 2005年8月20日,那么 <br> * calculate(d,GregorianCalendar.YEAR,-10)的值为1995年8月20日 <br> * 而calculate(d,GregorianCalendar.YEAR,+10)的值为2015年8月20日 <br> * * @param d * 日期(时间). * @param field * 日期成员. <br> * 日期成员主要有: <br> * 年:GregorianCalendar.YEAR <br> * 月:GregorianCalendar.MONTH <br> * 日:GregorianCalendar.DATE <br> * 时:GregorianCalendar.HOUR <br> * 分:GregorianCalendar.MINUTE <br> * 秒:GregorianCalendar.SECOND <br> * 毫秒:GregorianCalendar.MILLISECOND <br> * @param amount * 加减计算的幅度.+n=加n个由参数field指定的日期成员值;-n=减n个由参数field代表的日期成员值. * @return 计算后的日期(时间). */ private static Date calculate(Date d, int field, int amount) { if (d == null) return null; GregorianCalendar g = new GregorianCalendar(); g.setGregorianChange(d); g.add(field, amount); return g.getTime(); } /** * 日期(时间)转化为字符串. * * @param formater 日期或时间的格式. * @param aDate java.util.Date类的实例. * @return 日期转化后的字符串. */ public static String date2String(String formater, Date aDate) { if (formater == null || "".equals(formater)) return null; if (aDate == null) return null; return (new SimpleDateFormat(formater)).format(aDate); } /** * 当前日期(时间)转化为字符串. * * @param formater 日期或时间的格式. * @return 日期转化后的字符串. */ public static String date2String(String formater) { return date2String(formater, new Date()); } /** * 获取当前日期对应的星期数. * <br>1=星期天,2=星期一,3=星期二,4=星期三,5=星期四,6=星期五,7=星期六 * @return 当前日期对应的星期数 */ public static int dayOfWeek() { GregorianCalendar g = new GregorianCalendar(); int ret = g.get(java.util.Calendar.DAY_OF_WEEK); g = null; return ret; } /** * 获取所有的时区编号. <br> * 排序规则:按照ASCII字符的正序进行排序. <br> * 排序时候忽略字符大小写. * @return 所有的时区编号(时区编号已经按照字符[忽略大小写]排序). */ public static String[] fecthAllTimeZoneIds() { Vector<String> v = new Vector<String>(); String[] ids = TimeZone.getAvailableIDs(); for (int i = 0; i < ids.length; i++) { v.add(ids[i]); } Collections.sort(v, String.CASE_INSENSITIVE_ORDER); v.copyInto(ids); v = null; return ids; } /** * 将日期时间字符串根据转换为指定时区的日期时间. * * @param srcFormater 待转化的日期时间的格式. * @param srcDateTime 待转化的日期时间. * @param dstFormater 目标的日期时间的格式. * @param dstTimeZoneId 目标的时区编号. * * @return 转化后的日期时间. */ public static String string2Timezone(String srcFormater, String srcDateTime, String dstFormater, String dstTimeZoneId) { if (srcFormater == null || "".equals(srcFormater)) return null; if (srcDateTime == null || "".equals(srcDateTime)) return null; if (dstFormater == null || "".equals(dstFormater)) return null; if (dstTimeZoneId == null || "".equals(dstTimeZoneId)) return null; SimpleDateFormat sdf = new SimpleDateFormat(srcFormater); try { int diffTime = getDiffTimeZoneRawOffset(dstTimeZoneId); Date d = sdf.parse(srcDateTime); long nowTime = d.getTime(); long newNowTime = nowTime - diffTime; d = new Date(newNowTime); return date2String(dstFormater, d); } catch (ParseException e) { return null; } finally { sdf = null; } } public static String format(Date date, String format) { if (date == null) return ""; SimpleDateFormat formater = new SimpleDateFormat(format); return formater.format(date); } /** * 获取系统当前默认时区与UTC的时间差.(单位:毫秒) * @return 系统当前默认时区与UTC的时间差.(单位:毫秒) */ public static int getDefaultTimeZoneRawOffset() { return TimeZone.getDefault().getRawOffset(); } /** * 获取系统当前默认时区与指定时区的时间差.(单位:毫秒) * @param timeZoneId 时区Id * @return 系统当前默认时区与指定时区的时间差.(单位:毫秒) */ public static int getDiffTimeZoneRawOffset(String timeZoneId) { return TimeZone.getDefault().getRawOffset() - TimeZone.getTimeZone(timeZoneId).getRawOffset(); } /** * 将日期时间字符串根据转换为指定时区的日期时间. * * @param srcDateTime 待转化的日期时间. * @param dstTimeZoneId 目标的时区编号. * * @return 转化后的日期时间. * @see #string2Timezone(String, String, String, String) */ public static String string2TimezoneDefault(String srcDateTime, String dstTimeZoneId) { return string2Timezone("yyyy-MM-dd HH:mm:ss", srcDateTime, "yyyy-MM-dd HH:mm:ss", dstTimeZoneId); } /** * 将日期之间的差值. * * @param starDateTime 开始时间. * @param endDateTime 结束时间. * * @return 时间差值(秒). */ public static long compareTo(Date starDateTime, Date endDateTime) { long rel; try{ rel = endDateTime.getTime() - starDateTime.getTime(); rel = rel/1000; }catch(Exception e){ rel = 9999; } return rel; } /** * 将日期之间的差值. * * @param starDateTime 开始时间. * @param endDateTime 结束时间. * * @return 时间差值(秒). */ public static long compareTo(String starDateTime, String endDateTime) { long rel; try{ rel = formatDateTime(endDateTime).getTime() - formatDateTime(starDateTime).getTime(); rel = rel/1000; }catch(Exception e){ rel = 9999; } return rel; } }