記錄一下常用的時間工具類
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;
}
}