日期時間與字符串互相轉換

/**
 * 
 * @ClassName: DateUtils 
 * @Description: TODO(日期時間與字符串互相轉換 ) 
 * @author 劉霖晉
 * @date 2016年1月8日 下午6:08:23 
 *
 */
public class DateUtils {
/** 日期格式器--年 */
public static final String DATE_FORMAT_YEAR = "yyyy";
/** 日期格式器 */
public static final String DATE_FORMAT_MONTH = "yyyy-MM";
/** 日期格式器 */
public static final String DATE_FORMAT = "yyyy-MM-dd";
/** 日期格式器 */
public static final String DATE_FORMAT_NO_HYPHEN = "yyyyMMdd";
/** 時間格式器 */
public static final String TIME_FORMAT = "HH:mm:ss";
/** 日期時間格式器 */
public static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
/** 日期時間格式器-時分 */
public static final String DATETIME_FORMAT_HOUR_MINUTE_YEAR = "yyyy-MM-dd HH:mm";
/** 日期時間格式器-時分 */
public static final String DATETIME_FORMAT_HOUR_MINUTE = "HH:mm";
/** 日期時間格式器 */
public static final String DATETIME_FORMAT_1 = "yyyy-MM-dd 00:00:00";
/** 日期時間戳 */
public static final String DATETIME_STAMP = "yyyyMMddHHmmssSSS";
/** 日期時間戳 */
public static final String DATETIME_STAMP_NO_MS = "yyyyMMddHHmmss";
/** 時間戳 */
public static final String TIME_STAMP = "HHmmssSSS";
/** 秒*/
public static final int DATE_TYPE_SECOND = 0;
/** 分 */
public static final int DATE_TYPE_MINUTE= 1;
/** 時 */
public static final int DATE_TYPE_HOUR = 2;
/** 天 */
public static final int DATE_TYPE_DAY = 3;
/** 月 */
public static final int DATE_TYPE_MONTH = 4;
/** 年 */
public static final int DATE_TYPE_YEAR = 5;
/** 一年中所有的月份*/
public static final int MONTH_OF_YEAR = 12;


/** @category 將字符串解析成yyyy-MM-dd 的日期 */
public static Date parseDate(String value) {
try {
return new SimpleDateFormat(DATE_FORMAT, Locale.CHINA).parse(value);
} catch (ParseException e) {
return null;
}
}


/** @category 將字符串解析成HH:mm:ss的時間 */
public static Date parseTime(String value) {
try {
return new SimpleDateFormat(TIME_FORMAT, Locale.CHINA).parse(value);
} catch (ParseException e) {
return null;
}
}


/** @category 將字符串解析成yyyy-MM-dd HH:mm:ss的日期時間 */
public static Date parseDateTime(String value) {
try {
return new SimpleDateFormat(DATETIME_FORMAT, Locale.CHINA).parse(value);
} catch (ParseException e) {
return null;
}
}


/** @category 將字符串解析成yyyyMMddHHmmssSSS的日期時間 */
public static Date parseDateTimeStamp(String value) {
try {
return new SimpleDateFormat(DATETIME_STAMP, Locale.CHINA).parse(value);
} catch (ParseException e) {
return null;
}
}


/** @category 將時間解析成yyyy-MM-dd的字符串 */
public static String formatDate(Date date,boolean isHyphen) {
if(isHyphen){
return new SimpleDateFormat(DATE_FORMAT, Locale.CHINA).format(date);
}else{
return new SimpleDateFormat(DATE_FORMAT_NO_HYPHEN, Locale.CHINA).format(date);
}
}


/** @category 將時間解析成yyyy的字符串 */
public static String formatDateToYear(Date date) {
return new SimpleDateFormat(DATE_FORMAT_YEAR, Locale.CHINA).format(date);
}


/** @category 將日期解析成HH:mm:ss的字符串 */
public static String formatTime(Date date) {
return new SimpleDateFormat(TIME_FORMAT, Locale.CHINA).format(date);
}


/** @category 將日期時間解析成yyyy-MM-dd HH:mm:ss的字符串 */
public static String formatDateTime(Date date) {
return new SimpleDateFormat(DATETIME_FORMAT, Locale.CHINA).format(date);
}

/** @category 將日期時間解析成yyyy-MM-dd HH:mm:ss的字符串 */
public static String formatCurrentDateTime() {
return new SimpleDateFormat(DATETIME_FORMAT, Locale.CHINA).format(new Date());
}


/** @category 將日期解析成yyyyMMddHHmmssSSS的字符串 */
public static String formatDateTimestamp(Date date) {
return new SimpleDateFormat(DATETIME_STAMP, Locale.CHINA).format(date);
}

/** @category 將日期解析成yyyyMMddHHmmss的字符串 */
public static String formatDateTimestampNoMs(Date date) {
return new SimpleDateFormat(DATETIME_STAMP_NO_MS, Locale.CHINA).format(date);
}


/** @category 將日期解析成HHmmssSSS的字符串 */
public static String formatTimestamp(Date date) {
return new SimpleDateFormat(TIME_STAMP, Locale.CHINA).format(date);
}


/**
* @return
* @category 獲取當年天數
*/
public static int getDaysInYear() {
GregorianCalendar calendar = new GregorianCalendar();
return calendar.isLeapYear(calendar.get(Calendar.YEAR)) ? 366 : 365;
}


/**
* @return date型時間
* @throws Exception
* @category 格式化當前日期
* @author frank
* @Created 2012-10-11  下午2:42:55
*/
public static Date getSysDateOfDate() throws Exception {
// 獲取時間 並轉換格式
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat(DATETIME_FORMAT, Locale.CHINA);
return formatter.parse(formatter.format(date));
}

/**
* @param calendarType Calendar.DATE、Calendar.MONTH、Calendar.YEAR等
* @param num          對應日期類型對應的數量
* @return 指定date型時間
* @throws Exception
* @category 獲取指定日期並格式化日期。比如:離現在30天前的日期、獲取上個月日期
*/
public static Date getDefineDate(int calendarType, int num) {
Calendar cal = Calendar.getInstance();
cal.add(calendarType, num);
SimpleDateFormat formatter = new SimpleDateFormat(DATETIME_FORMAT_1);
try {
return formatter.parse(formatter.format(cal.getTime()));
} catch (ParseException e) {
return null;
}
}


/**
* @param SpecifiedDate 指定的時間,即需要比較的時間
* @param largeDate     到期的時間,即比較大的時間
* @return 天數差
* @category 計算指定時間與當前時間的天數差
*/
public static int getDaysDifference(Date SpecifiedDate, Date largeDate) {
Calendar cNow = Calendar.getInstance();
Calendar cReturnDate = Calendar.getInstance();
cNow.setTime(largeDate);
cReturnDate.setTime(SpecifiedDate);
setTimeToMidnight(cNow);
setTimeToMidnight(cReturnDate);
long todayMs = cNow.getTimeInMillis();
long returnMs = cReturnDate.getTimeInMillis();
long intervalMs = todayMs - returnMs;
return (int) (intervalMs / (1000 * 86400));
}


private static void setTimeToMidnight(Calendar calendar) {
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
}

/**  
     * @param referenceDate 需要比較的時間 不能爲空(null),需要正確的日期格式  
     * @param date 被比較的時間  爲空(null)則爲當前時間  
     * @param stype 返回值類型   0爲多少天,1爲多少個月,2爲多少年  
     * @return  
* @throws ParseException 
     */ 
public static int compareDate(String referenceDate , String date, int stype) throws ParseException {
int n = 0;
String formatStyle = stype == 1 ? DATE_FORMAT_MONTH : DATE_FORMAT;


date = date == null ? formatDate(new Date(),true) : date;


DateFormat df = new SimpleDateFormat(formatStyle);
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(df.parse(referenceDate));
c2.setTime(df.parse(date));

while (!c1.after(c2)) { // 循環對比,直到相等,n 就是所要的結果
n++;
if (stype == 1) {
c1.add(Calendar.MONTH, 1); // 比較月份,月份+1
} else if(stype == 0) {
c1.add(Calendar.DATE, 1); // 比較天數,日期+1
}
}


n = n - 1;


if (stype == 2) {
n = (int) n / 365;
}

return n;
}

/**
* @Title: compareDate
* @Description: 比較兩個時間的大小
* @param date1 時間1
* @param date2 時間2
* @return -1:時間1比時間2小,1:時間1比時間2大
* @throws Throwable
*/
public static int compareDate(String date1 , String date2) throws ParseException{

date2 = date2 == null ? formatDateTime(new Date()) : date2;

DateFormat df = new SimpleDateFormat(DATETIME_FORMAT);
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();

c1.setTime(df.parse(date1));
c2.setTime(df.parse(date2));

return c1.compareTo(c2);
}

/**
* @Title: addtime
* @Description: 增加時間
* @param date 需要被增加的時間
* @param stype 0:表示秒,1表示分,2表示時,3表示天,4表示月,5表示年
*/
public static String addtime(String date,int addNum,int stype) throws ParseException{

date = date == null ? formatDateTime(new Date()) : date;

DateFormat df = new SimpleDateFormat(DATETIME_FORMAT);
Calendar c1 = Calendar.getInstance();
c1.setTime(df.parse(date));

switch(stype){
case 0 : c1.add(Calendar.SECOND, addNum); break; // 秒    
case 1 : c1.add(Calendar.MINUTE, addNum); break;// 分    
case 2 : c1.add(Calendar.HOUR, addNum); break;// 時    
case 3 : c1.add(Calendar.DATE, addNum); break;// 天    
case 4 : c1.add(Calendar.MONTH, addNum); break;// 月份
case 5 : c1.add(Calendar.YEAR, addNum); break;// 年份
default : ;
}
return formatDateTime(c1.getTime());
}

/**
* @category 獲取當前時間之前/之後多少年/月/日的時間
* @param format 日期格式
* @param variable 正數代表時間之後,負數代表時間之前
* @param field 單位,年,月,日
* @return
*/
public static String getDiffDate(String format,int variable,int field) {
Calendar c = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat(format, Locale.CHINA);
c.set(field, variable);
return formatter.format(c.getTime());
}

/**
* @Title: addTime
* @Description: 指定格式,給當前時間增加多少個月的時間
* @param format 指定格式
* @param field 日曆類型
* @param amount 需要增加的數值
* @return
* @throws ParseException
*/
public static String addTime(String format, int field, int amount) throws ParseException {
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(field, amount);
return new SimpleDateFormat(format).format(c.getTime());
}


/**
* @Title: comparePublishLoanSignTime
* @Description: 獲取當前時間與指定時間的相距的秒數
* @param date 指定時間
* @return 秒數(如果返回負值,表示當前時間已經超過了指定時間)
* @throws ParseException
*/
public static long comparePublishLoanSignTime(String date,boolean secondDay) throws Throwable{
SimpleDateFormat sdf = new SimpleDateFormat(DATETIME_FORMAT_HOUR_MINUTE);
SimpleDateFormat sdf2 = new SimpleDateFormat(DATE_FORMAT, Locale.CHINA);
SimpleDateFormat sdf3 = new SimpleDateFormat(DATETIME_FORMAT_HOUR_MINUTE_YEAR);

StringBuilder builder = new StringBuilder();

String currentDate = sdf2.format(new Date());

String currentMinuteSecond = sdf.format(new Date());


builder.append(currentDate).append(" ").append(currentMinuteSecond);

long currentTime = sdf3.parse(builder.toString()).getTime();
builder.setLength(0);

if(secondDay){
Calendar c1 = Calendar.getInstance();
c1.setTime(sdf2.parse(currentDate));

c1.add(Calendar.DATE, 1);

currentDate = sdf2.format(c1.getTime());
}

builder.append(currentDate).append(" ").append(date);

long sourceTime = sdf3.parse(builder.toString()).getTime();



return (sourceTime - currentTime) / 1000;

}

/**
* @Title: getDateDiff
* @Description: 獲取當前日期與傳入的日期差值
* @param date 傳入的日期
* @return 差值
* @throws Throwable
*/
public static long getDateDiff(String date) throws Throwable{
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);

//一天的毫秒數
long nd = 1000*24*60*60;

//獲得兩個時間的毫秒時間差異

long paraDateTime = sdf.parse(date).getTime();

long currentTime = sdf.parse(sdf.format(new Date())).getTime();

return (currentTime - paraDateTime)/nd;

}

/**
* @Title: getDateDiffMinute
* @Description: 獲取兩個時間的相差的分鐘數
* @param date1 時間1(格式:yyyy-MM-dd HH:mm:ss)
* @param date2 時間2(格式:yyyy-MM-dd HH:mm:ss),如果時間2爲空,則默認爲當前時間
* @return 相差的分鐘數
* @throws Throwable
*/
public static long getDateDiffMinute(String date1,String date2) throws Throwable{
date2 = date2 == null ? formatCurrentDateTime() : date2;

SimpleDateFormat sdf = new SimpleDateFormat(DATETIME_FORMAT);

//一分鐘的毫秒數
long nd = 1000*60;

//獲得兩個時間的毫秒時間差異

long paraDateTime = sdf.parse(date1).getTime();

long currentTime = sdf.parse(date2).getTime();

return (currentTime - paraDateTime)/nd;
}

/**
* @throws Exception 

* @Title: getTwoDateDay 
* @Description: TODO(獲取兩時間直接天數) 
* @param @return    設定文件 
* @return Object    返回類型 
* llj
* @throws
*/
public static Object getTwoDateDay(String date1,String date2) throws Exception {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long l_date1=sdf.parse(date1).getTime();
long l_date2=sdf.parse(date2).getTime();
int dayCount=(int)((l_date2-l_date1)/(1000*60*60*24));
return dayCount;
}

/**

* @Title: getNewDateTime 
* @Description: TODO(llj 獲取當前時間) 
* @param @return    設定文件 
* @return Object    返回類型 
* @throws
*/
public static String getNewDateTime() {
Date now = new Date(); 
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//可以方便地修改日期格式
String hehe = dateFormat.format( now ); 
return hehe;
}

/**

* @Title: getWeekOfDate 
* @Description: TODO(獲取當前星期) 
* @param @param dt
* @param @return    設定文件 
* @return String    返回類型 
* @throws
*/
public static String getWeekOfDate(Date dt) {
        String[] weekDays = {"7", "1", "2", "3", "4", "5", "6"};
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0)
            w = 0;
        return weekDays[w];
    }


/**
* 算出日期多少日期前
* @param date
* @return
* @throws ParseException
*/
public static String getDataFormat(Date date)  throws ParseException {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date now = df.parse(df.format(new Date()));
date=df.parse(df.format(date));
long l=now.getTime()-date.getTime();
long day=l/(24*60*60*1000); //天
long hour=(l/(60*60*1000)-day*24); //小時
long min=((l/(60*1000))-day*24*60-hour*60); //分
long s=(l/1000-day*24*60*60-hour*60*60-min*60); //秒
//System.out.println(day+"天"+hour+"時"+min+"分"+s+"秒");
if(day>0 && day<4){
if(day==1){
return "一天前";
}else if(day==2){
return "兩天前";
}else{
return "三天前";
}
}else if(day>3){
return sdf.format(date);
}else{
if(hour>0){
return hour+"小時前";
}else{
if(min>0){
return min+"分鐘前";
}else{
return s+"秒鐘前";
}
}
}
}

/**
* @Title: getTimeDistance
* @Description: 獲取一個時間距離當前時間多少天,或多少時,或多少分鐘,或多少秒

* @param time 格式 yyyy-MM-dd HH:mm:ss 的時間字符串 
* @return 當間隔是天時,返回【多少天前】;當間隔是小時時,返回【多少時前】;當間隔是分鐘時,返回【多少分鐘前】;當間隔是秒時,返回【多少秒鐘前】
* @throws ParseException 
*/
public static String getTimeDistance(String time){

try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = df.parse(time);
Date now = df.parse(df.format(new Date()));
date=df.parse(df.format(date));

long l=now.getTime()-date.getTime();
long day=l/(24*60*60*1000); //天
long hour=(l/(60*60*1000)-day*24); //小時
long min=((l/(60*1000))-day*24*60-hour*60); //分
long s=(l/1000-day*24*60*60-hour*60*60-min*60); //秒

if(day > 0){
return day + "天前";
}

if(hour > 0){
return hour+"小時前";
}

if(min > 0){
return min+"分前";
}

return s+"秒鐘前";
} catch (ParseException e) {
e.printStackTrace();
}

return "";

}

public static void main(String[] args)throws Throwable {
System.out.println(getTimeDistance("2016-03-11 12:02:36"));
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章