JAVA日期時間常用工具類

記錄一下常用的時間工具類

1. 創建時間格式枚舉

類似於常量定義,方便使用

package com.zhh.util.dateutil;
/**
 * 時間字符串格式枚舉
 * 
 */
public enum DateFormatter {
	
    /**
     *將日期格式化爲日期/時間字符串,或者從給定字符串的開頭解析文本,生成格式爲“yyyy-MM-dd”的日期 
     */
    Year_To_Day("yyyy-MM-dd"),
    Year_To_Hour("yyyy-MM-dd HH"),
    Year_To_Minute("yyyy-MM-dd HH:mm"),
    /**
     *將日期格式化爲日期/時間字符串,或從給定字符串的開頭解析文本,生成格式爲“yyyy-MM-dd HH:mm:ss”的日期 
     */
    Year_To_Second("yyyy-MM-dd HH:mm:ss"),
    Year_To_Millisecond("yyyy-MM-dd HH:mm:ss.SSS"),
    YearToDay("yyyyMMdd"),
    YearToHour("yyyyMMddHH"),
    YearToMinute("yyyyMMddHHmm"),
    YearToSecond("yyyyMMddHHmmss"),
    YearToMillisecond("yyyyMMddHHmmssSSS");

    private String pattern = "";

    private DateFormatter(String pattern) {
        this.pattern = pattern;
    }

    @Override
    public String toString() {
        return this.pattern;
    }

    public String value() {
        return this.pattern;
    }
}

2. 創建時間轉換工具類

 

package com.zhh.util.dateutil;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;

/**
 * 時間工具類
 * @author zhaoheng
 */
public class DateUtil {
	/**
	 * 一天的秒數
	 */
	public static final int DATE_TIMEMILLIONS = 86400;
	
    /**
     * 根據formatter指定的日期格式,日期轉換字符串
     *
     * @param date 時間、日期
     * @param dateFormatter 字符串格式 例如:yyyy-MM-dd
     * @return
     */
    public static String formatDateToString(Date date, DateFormatter dateFormatter) {
        if (null == date || null == dateFormatter) {
            return "";
        }

        DateFormat dateFormat = new SimpleDateFormat(dateFormatter.value());

        return dateFormat.format(date);
    }

    /**
     * 根據formatter指定的日期格式,字符串轉換日期
     *
     * @param date	時間
     * @param dateFormatter 字符串格式
     * @return Date
     * @throws ParseException
     */
    public static Date formatStringToDate(String date, DateFormatter dateFormatter) throws ParseException {
        if (null == date || null == dateFormatter || "".equals(date)) {
            return null;
        }

        DateFormat dateFormat = new SimpleDateFormat(dateFormatter.value());

        return dateFormat.parse(date.replaceAll("/", "-"));
    }

    /**
     * 根據formatter指定的日期格式,字符串轉換日期
     *
     * @param date
     * @param dateFormatter
     * @return Date
     * @throws ParseException
     */
    public static Date formatDateToDate(Date date, DateFormatter dateFormatter) throws ParseException {
        if (null == date || null == dateFormatter) {
            return null;
        }

        DateFormat dateFormat = new SimpleDateFormat(dateFormatter.value());

        return dateFormat.parse(dateFormat.format(date));
    }

    /**
     * 兩個時間之間的天數差(結束時間小於開始時間就是負數)
     *
     * @param date1 開始時間
     * @param date2 結束時間
     * @param isRoundUp 有餘數時是否按一天計算
     * @return
     */
    public static Integer daysBetweenDates(Date date1, Date date2, boolean isRoundUp) {
        if (null == date1 || null == date2) {
            return null;
        }

        int days = (int) ((date1.getTime() - date2.getTime()) / 86400000);
        int mod = (int) ((date1.getTime() - date2.getTime()) % 86400000);

        if (isRoundUp && mod > 0) {
            days = days + 1;
        }

        return days;
    }
    
    /**
     * 兩個時間之間的天數差(天數差絕對值,沒有負值)
     *
     * @param date1
     * @param date2
     * @param isRoundUp 有餘數時是否按一天計算
     * @return
     */
    public static Integer daysBetweenDatesByAbsolute(Date date1, Date date2, boolean isRoundUp) {
        if (null == date1 || null == date2) {
            return null;
        }

        int days = Math.abs((int) ((date1.getTime() - date2.getTime()) / 86400000));
        int mod = Math.abs((int) ((date1.getTime() - date2.getTime()) % 86400000));

        if (isRoundUp && mod > 0) {
            days = days + 1;
        }

        return days;
    }
    
    /**
     * 使用給定字段年、月、日獲取日期。
     *
     * @param year 月
     * @param month 日
     * @param day 天
     * @return
     */
    public static Date date(int year, int month, int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, day, 0, 0, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        return calendar.getTime();
    }

    /**
     * 使用給定字段年、月、日、小時獲取日期(24小時制).
     *
     * @param year	年
     * @param month	月
     * @param day	日
     * @param hour  (24小時制)
     * @return
     */
    public static Date date(int year, int month, int day, int hour) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, day, hour, 0, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        return calendar.getTime();
    }

    /**
     * 使用給定的日期字段的一年,月,日,小時(24小時制),分鐘
     *
     * @param year	年
     * @param month	月
     * @param day	日
     * @param hour   (24小時制)
     * @param minute	分
     * @return
     */
    public static Date date(int year, int month, int day, int hour, int minute) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, day, hour, minute, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        return calendar.getTime();
    }

    /**
     * Gets a date using the given fields year,month,day,hour(24小時制),minute,second.
     *
     * @param year	年
     * @param month	月
     * @param day	日
     * @param hour   (24小時制)
     * @param minute	分
     * @param second	秒
     * @return
     */
    public static Date date(int year, int month, int day, int hour, int minute, int second) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, day, hour, minute, second);
        calendar.set(Calendar.MILLISECOND, 0);

        return calendar.getTime();
    }

    /**
     * 比較兩個時間是否相等
     *
     * @param date1
     * @param date2
     * @param dateFormatter 比較維度,如:Year_To_Day比較年月日;Year_To_Second比較年月日時分秒
     * @return
     */
    public static boolean isTwoDateEquals(Date date1, Date date2, DateFormatter dateFormatter) {
        Date nowDate = new Date();

        if (null == date1) {
            date1 = nowDate;
        }

        if (null == date2) {
            date2 = nowDate;
        }

        String dateStr1 = formatDateToString(date1, dateFormatter);
        String dateStr2 = formatDateToString(date2, dateFormatter);

        if (dateStr1 == dateStr2 || dateStr1.equals(dateStr2)) {
            return true;
        }

        return false;
    }

    /**
     * 判斷年份是否爲閏年
     *
     * @param year
     * @return
     */
    public static boolean isLeapYear(int year) {
        return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    }

    /**
     * 判斷時間區間是否包含閏年(只計算是否包含2.29)
     *
     * @param startDate
     * @param endDate
     * @return
     */
    public static boolean isContainLeapYear(Date startDate, Date endDate) {

        if (startDate == null || endDate == null) {
            return false;
        }

        Calendar startTime = Calendar.getInstance();
        Calendar endTime = Calendar.getInstance();
        startTime.setTime(startDate);
        endTime.setTime(endDate);

        int startDay = startTime.get(Calendar.DAY_OF_YEAR);
        int endDay = endTime.get(Calendar.DAY_OF_YEAR);
        int startYear = startTime.get(Calendar.YEAR);
        int endYear = endTime.get(Calendar.YEAR);

        if (isLeapYear(startYear) && startDay <= 60 && (endDay >= 60 || startYear != endYear)) {
            return true;
        } else if (isLeapYear(endYear) && endDay >= 60 && (startDay <= 60 || startYear != endYear)) {
            return true;
        } else {
            return false;
        }

    }

    /**
     * 判斷時間格式是否正確
     * 
     * @param strDate
     * @return
     */
    public static boolean isValidDate(String strDate) {
        boolean convertSuccess = true;
        // 指定日期格式爲四位年/兩位月份/兩位日期,注意yyyy/MM/dd區分大小寫;
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        if (StringUtils.isNotBlank(strDate)) {
            try {
                // 設置lenient爲false. 否則SimpleDateFormat會比較寬鬆地驗證日期,比如2007/02/29會被接受,並轉換成2007/03/01
                format.setLenient(false);
                format.parse(strDate);
            } catch (ParseException e) {
                // e.printStackTrace();
                // 如果throw java.text.ParseException或者NullPointerException,就說明格式不對
                convertSuccess = false;
            }
        } else {
            convertSuccess = false;
        }
        return convertSuccess;
    }

    /**
     * 將yyyy年MM月DD日轉成yyyy-mm-dd
     */
    public static String formatStrToString(String str) {
        if (StringUtils.isNotBlank(str)) {
            if (str.indexOf("年") > 0 && str.indexOf("月") > 0 && str.indexOf("日") > 0) {
                str = str.substring(0, str.indexOf("年")) + "-"
                        + str.substring(str.indexOf("年") + 1, str.indexOf("月")) + "-"
                        + str.substring(str.indexOf("月") + 1, str.indexOf("日"));
            }
        }
        return str;
    }
    
    /**
     * 時間轉指定格式字符串
     * @param date	時間
     * @param format 格式 例如 yyyy-MM-dd HH:mm:ss
     * @return
     */
    
	public static String dateToString(Date date,String format){
		String timeString="";
		if(date==null)
		{
			date=new Date();
		}
		if(format==null || format.trim().equals(""))
		{
			format="yyyy-MM-dd HH:mm:ss";
		}
		SimpleDateFormat sf = new SimpleDateFormat(format.trim());
		timeString=sf.format(date);			
		return timeString;
	}
}

 

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