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;
}
}