在日常的编程中,常常需要处理日期。但是使用 java.util.Calendar 类处理日期/时间,非常的麻烦。那么福音来了,博主给大家隆重的介绍一款新的类库Joda-Time!并且,已经将其封装成一个“日期处理万能工具类”。拿去直接用就好了,有没有很开心!
在分享工具类之前,简单啰嗦几句关于“Joda-Time”的简单介绍:Joda-Time 令时间和日期值变得易于管理、操作和理解,事实上,易于使用是 Joda 的主要设计目标,其他目标包括可扩展性、完整的特性集以及对多种日历系统的支持,并且 Joda 与 JDK 是百分之百可互操作的,因此您无需替换所有 Java 代码,只需要替换执行日期/时间计算的那部分代码。
代码如下:
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.PeriodType;
import org.joda.time.Years;
import org.joda.time.format.DateTimeFormat;
import com.alibaba.fastjson.JSONObject;
import com.thunisoft.zhfy.base.consts.urlconsts.QXJSFWConsts;
/**
* DateUtil
* 日期工具类
* @author gaowang
* @version 1.0
*
*/
public class DateUtil {
/*
* 日期格式化模板
*/
/**日期格式化 年-月-日 */
public static final String PATTEN_DATE = "yyyy-MM-dd";
/**日期格式化 时:分:秒*/
public static final String PATTEN_TIME = "HH:mm:ss";
/**日期格式化 时:分*/
public static final String PATTEN_HOUR_MINUTE = "HH:mm";
/**日期格式化 年-月-日 时:分:秒*/
public static final String PATTEN_DATETIME = "yyyy-MM-dd HH:mm:ss";
/**日期格式化 yyyyMMdd HH:mm:ss*/
public static final String PATTEN_DATETIME_THIN = "yyyyMMdd HH:mm:ss";
/**日期格式化 yyyyMMdd_HHmmss*/
public static final String PATTEN_DATETIME_THINER = "yyyyMMdd_HHmmss";
/**日期格式化中文 年-月-日 */
public static final String PATTEN_CN_DATE = "yyyy年MM月dd日";
/**日期格式化中文 年-月-日 时:分*/
public static final String PATTEN_CN_DATETIME_NO_SECOND = "yyyy年MM月dd日HH时mm分";
/**日期格式化中文 年-月-日上午/下午时:分*/
public static final String PATTEN_CN_DATETIME_NO_SECOND_AMORPM = "yyyy年MM月dd日aHH时mm分";
/**日期格式化中文 年-月-日 时:分:秒*/
public static final String PATTEN_CN_DATETIME = "yyyy年MM月dd日HH时mm分ss秒";
/**日期格式化中文 年-月-日 时:分:秒 时间戳*/
public static final String PATTEN_TIMESTAMP = "EEE MMM dd HH:mm:ss Z yyyy";
/**日期格式化 yyyyMMddHH:mm:ss*/
public static final String PATTEN_DATETIME_SERIAL = "yyyyMMddHHmmss";
/**
* 将日期转换为当天的开始时间
* 例:2016-07-23 18:32:31转2016-07-23 00:00:00
* @param startDate
* @return
*/
public static Date dateToStartTime(Date startDate) {
if (null == startDate) {
return null;
}
return new DateTime(startDate.getTime()).withTimeAtStartOfDay().toDate();
}
/**
* 将日期转换为当天的结束时间
* 例:2016-07-23 18:32:31转2016-07-23 23:59:59
* @param startDate
* @return
*/
public static Date dateToEndTime(Date startDate) {
if (null == startDate) {
return null;
}
return new DateTime(startDate.getTime()).millisOfDay().withMaximumValue().toDate();
}
/**
* 获取当前日期字符串
* @param 格式化串
* @return
*/
public static String getCurDateStr(String pattenStr) {
return DateTime.now().toString(pattenStr);
}
/**
* 获取当前年
* @return
*/
public static int getCurYear() {
return DateTime.now().getYear();
}
/**
* 获取当前月
* @return
*/
public static int getCurMonth() {
return DateTime.now().getMonthOfYear();
}
/**
* 获取当前日
* @return
*/
public static int getCurDay() {
return DateTime.now().getDayOfMonth();
}
/**
* 获取指定日期的年
* @return
*/
public static int getYearOfDate(Date date) {
return new DateTime(date.getTime()).getYear();
}
/**
* 获取指定日期的月
* @return
*/
public static int getMonthOfDate(Date date) {
return new DateTime(date.getTime()).getMonthOfYear();
}
/**
* 获取指定日期的日
* @return
*/
public static int getDayOfDate(Date date) {
return new DateTime(date.getTime()).getDayOfMonth();
}
/**
* 将指定日期格式化为自定义格式
* @param date 指定日期
* @param patten 格式化模板
* @return 自定义格式化字符串
*/
public static String format(Date date, String patten) {
if (null == date) {
return null;
}
return new DateTime(date.getTime()).toString(patten);
}
/**
* 字符串格式转成日期
* @param dateTimeStr 年-月-日 时:分:秒 格式字符串
* @return Date
*/
public static Date parseDate(String dateTimeStr) {
if (StringUtils.isBlank(dateTimeStr)) {
return null;
}
return DateTime.parse(dateTimeStr, DateTimeFormat.forPattern(PATTEN_DATETIME)).toDate();
}
/**
* 字符串格式转成日期
* @param dateTimeStr 日期字符串
* @param pattenStr 格式
* @return Date
*/
public static Date parseDate(String dateTimeStr, String pattenStr) {
if (StringUtils.isBlank(dateTimeStr)) {
return null;
}
dateTimeStr = trimDateStringToPattenStringLength(dateTimeStr, pattenStr);
return DateTime.parse(dateTimeStr, DateTimeFormat.forPattern(pattenStr)).toDate();
}
private static String trimDateStringToPattenStringLength(String dateString, String pattenString) {
if (StringUtils.isNotEmpty(dateString) && StringUtils.isNotEmpty(pattenString)) {
int len = Math.min(dateString.length(), pattenString.length());
dateString = dateString.substring(0, len);
}
return dateString;
}
/**
* 重新组装一个时间 这是时间取date的年月日和time的时分秒
* @param date 年月日所在时间
* @param time 时分秒所在时间
* @return
*/
public static Date reassemDate(Date date, Date time) {
Calendar c1 = Calendar.getInstance();
c1.setTime(date);
Calendar c2 = Calendar.getInstance();
c2.setTime(time);
Calendar newCal = Calendar.getInstance();
newCal.set(c1.get(Calendar.YEAR), c1.get(Calendar.MONTH), c1.get(Calendar.DAY_OF_MONTH), c2.get(Calendar.HOUR_OF_DAY),
c2.get(Calendar.MINUTE), c2.get(Calendar.SECOND));
return newCal.getTime();
}
/**
* 重新组装一个时间,把传入的日期拼接 当前时间的时分秒
* @param date
* @return
*/
public static Timestamp date2Timestamp(Date date){
Date dateTime =DateUtil.reassemDate(date, new Timestamp(System.currentTimeMillis()));
Timestamp timestamp =new Timestamp(dateTime.getTime());
return timestamp;
}
/**
* 获取本周的第一天开始日期时间
* @return
*/
public static Date getCurrentWeekFirst() {
DateTime dateTime = new DateTime().dayOfWeek().withMinimumValue().withTimeAtStartOfDay();
return dateToStartTime(dateTime.toDate());
}
/**
* 获取指定日期所在周的第一天开始日期时间
* @param date 指定日期
* @return
*/
public static Date getTargetWeekFirst(Date date) {
DateTime dateTime = new DateTime(date.getTime()).dayOfWeek().withMinimumValue().withTimeAtStartOfDay();
return dateToStartTime(dateTime.toDate());
}
/**
* 获取本周的最后一天结束日期时间
* @return
*/
public static Date getCurrentWeekLast() {
DateTime dateTime = new DateTime().dayOfWeek().withMaximumValue();
return dateToEndTime(dateTime.toDate());
}
/**
* 获取指定日期所在周的最后一天结束日期时间
* @param date 指定日期
* @return
*/
public static Date getTargetWeekLast(Date date) {
DateTime dateTime = new DateTime(date.getTime()).dayOfWeek().withMaximumValue();
return dateToEndTime(dateTime.toDate());
}
/**
* 获取今日是在本周的索引
* 例如:周一返回1;周日返回7
* @return index
*/
public static int getCurDayInWeekIndex() {
return new DateTime().getDayOfWeek();
}
/**
* 获取指定日期是在其所在周的索引
* 例如:周一返回1;周日返回7
* @return index
*/
public static int getDayInWeekIndex(Date date) {
return new DateTime(date.getTime()).getDayOfWeek();
}
/**
* 得到指定日期在前/后N个星期中的对应日期
* weekNum>0表示获取N个星期后
* weekNum<0表示获取N个星期前
* @param date 指定日期
* @param weekNum 计算星期个数
* @return
*/
public static Date getPlusWeekDate(Date date, int weekNum) {
DateTime dateTime = new DateTime(date.getTime());
return dateTime.plusWeeks(weekNum).toDate();
}
/**
* 得到指定日期在前/后N个月中的对应日期
* monthNum>0表示获取N个月后
* monthNum<0表示获取N个月前
* @param date 指定日期
* @param monthNum 计算月个数
* @return
*/
public static Date getPlusMonthDate(Date date, int monthNum) {
DateTime dateTime = new DateTime(date.getTime());
return dateTime.plusMonths(monthNum).toDate();
}
/**
* 得到指定日期在前/后N个年中的对应日期
* monthNum>0表示获取N个年后
* monthNum<0表示获取N个年前
* @param date 指定日期
* @param monthNum 计算年个数
* @return
*/
public static Date getPlusYearDate(Date date, int yearNum) {
DateTime dateTime = new DateTime(date.getTime());
return dateTime.plusYears(yearNum).toDate();
}
/**
* 得到指定日期在前/后N天的对应日期
* dayNum>0表示获取N天后
* dayNum<0表示获取N天前
* @param date 指定日期
* @param dayNum 计算天数
* @return
*/
public static Date getPlusDayDate(Date date, int dayNum) {
DateTime dateTime = new DateTime(date.getTime());
return dateTime.plusDays(dayNum).toDate();
}
/**
* 得到指定日期在前/后N分钟的对应日期
* dayNum>0表示获取N分钟后
* dayNum<0表示获取N分钟前
* @param date 指定日期
* @param minuteNum 计算分钟数
* @return
*/
public static Date getPlusMinuteDate(Date date, int minuteNum) {
DateTime dateTime = new DateTime(date.getTime());
return dateTime.plusMinutes(minuteNum).toDate();
}
/**
* 获取本月的第一天开始日期时间
* @return 年-月-日 时:分:秒 格式字符串
*/
public static Date getCurrentMonthFirst() {
DateTime dateTime = new DateTime().dayOfMonth().withMinimumValue().withTimeAtStartOfDay();
return dateToStartTime(dateTime.toDate());
}
/**
* 获取指定日期所在月的第一天开始日期时间
* @param date
* @return 年-月-日 时:分:秒 格式字符串
*/
public static Date getTargetMonthFirst(Date date) {
DateTime dateTime = new DateTime(date.getTime()).dayOfMonth().withMinimumValue().withTimeAtStartOfDay();
return dateToStartTime(dateTime.toDate());
}
/**
* 获取本月的最后一天结束日期时间
* @return 年-月-日 时:分:秒 格式字符串
*/
public static Date getCurrentMonthLast() {
DateTime dateTime = new DateTime().dayOfMonth().withMaximumValue();
return dateToEndTime(dateTime.toDate());
}
/**
* 获取指定日期所在月的最后一天结束日期时间
* @param date
* @return 年-月-日 时:分:秒 格式字符串
*/
public static Date getTargetMonthLast(Date date) {
DateTime dateTime = new DateTime(date.getTime()).dayOfMonth().withMaximumValue();
return dateToEndTime(dateTime.toDate());
}
/**
* 得到当前月的天数
* @return
*/
public static int getCurMonthDays() {
return DateTime.now().dayOfMonth().getMaximumValue();
}
/**
* 得到指定年月的天数
* @param year
* @param month
* @return
*/
public static int getTargetMonthDays(int year, int month) {
return new DateTime(year, month, 1, 0, 0).dayOfMonth().getMaximumValue();
}
/**
* 得到指定年的天数
* @param year
* @return
*/
public static int getTargetYearDays(int year) {
return new DateTime(year, 1, 1, 0, 0).dayOfMonth().getMaximumValue();
}
/**
* 判断两个日期是否相同
* @param dateSrc 源日期
* @param dateDesc 目标日期
* @return Boolean
*/
public static boolean isEqual(Date dateSrc, Date dateDesc) {
DateTime dateTimeSrc = new DateTime(dateSrc.getTime());
DateTime dateTimeDesc = new DateTime(dateDesc.getTime());
return dateTimeSrc.equals(dateTimeDesc);
}
/**
* 源日期是否在目标日期之后
* @param dateSrc
* @param dateDesc
* @return Boolean
*/
public static boolean isAfter(Date dateSrc, Date dateDesc) {
DateTime dateTimeSrc = new DateTime(dateSrc.getTime());
DateTime dateTimeDesc = new DateTime(dateDesc.getTime());
return dateTimeSrc.isAfter(dateTimeDesc);
}
/**
* 源日期是否在目标日期之前
* @param dateSrc
* @param dateDesc
* @return Boolean
*/
public static boolean isBefore(Date dateSrc, Date dateDesc) {
DateTime dateTimeSrc = new DateTime(dateSrc.getTime());
DateTime dateTimeDesc = new DateTime(dateDesc.getTime());
return dateTimeSrc.isBefore(dateTimeDesc);
}
public static boolean isSameDay(Date dateSrc, Date dateDesc) {
String dateSrcStr = format(dateSrc, PATTEN_DATE);
String dateDescStr = format(dateSrc, PATTEN_DATE);
return dateSrcStr.equals(dateDescStr);
}
/**
* 计算年龄
* @param date 出生日期
* @return 年龄
*/
public static int calcAge(Date date) {
DateTime birthDay = new DateTime(date.getTime());
return Years.yearsBetween(birthDay, DateTime.now()).getYears();
}
/**获取当前系统时间 格式:YYYY-MM-DD hh:mm:ss
* @return
*/
public static java.sql.Timestamp getSysSqlTimestamp() {
return new java.sql.Timestamp(System.currentTimeMillis());
}
/**获取Sql时间 格式:YYYY-MM-DD hh:mm:ss
* @return
*/
public static java.sql.Timestamp getSqlTimestamp(Date date) {
if (date == null) {
return null;
}
return new java.sql.Timestamp(date.getTime());
}
/**
* 获取
* @param date
* @return
*/
public static java.sql.Date getSqlDate(Date date) {
if (date == null) {
return null;
}
return new java.sql.Date(date.getTime());
}
/**
* 获取sql.date类型,dateString长度不限,只取起始开始与pattern匹配的部分
* @param dateString 如"2011年2月11日"。
* 取dateString与pattern匹配的起始部分解析
* 比如 dateString = "2012-12-12 12:12:12",patternString="yyyy-MM-dd",这种情况也是可以正常返回值的;
* 结果是 2012-12-12
* @return
* @throws ParseException
*/
public static java.sql.Date getSqlDate(String dateString, String pattenString) throws ParseException {
dateString = trimDateStringToPattenStringLength(dateString, pattenString);
Date date = parseDate(dateString, pattenString);
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
return sqlDate;
}
/**
* java.sql.date转化为java.util.date
* @param date
* @return
*/
public static Date toDate(java.sql.Date date) {
return new Date(date.getTime());
}
/**
* java.sql.timestamp转化为java.util.date
* @param timestamp
* @return
*/
public static Date toDate(java.sql.Timestamp timestamp) {
return new Date(timestamp.getTime());
}
/**
* 计算两个日期的间隔天数
* @param dateSrc 开始日期
* @param dateDesc 结束日期
* @return 间隔天数
*/
public static int getIntervalDays(Date dateSrc, Date dateDesc) {
Period p = new Period(new DateTime(dateSrc.getTime()), new DateTime(dateDesc.getTime()), PeriodType.days());
return p.getDays();
}
/**
* 判断时间是否是上午
* @param date 时间
* @return
*/
public static boolean isAM(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.AM_PM) == Calendar.AM;
}
/**
* 格式化自定义个格式时间
* @param patten patten
* @param date 日期
* @return
*/
public static String convertDateToString(String patten, Date date) {
SimpleDateFormat sf = new SimpleDateFormat(patten);
return sf.format(date);
}
/**
* @param dJcybczc
* @param dJyzpt
* @return
*/
public static Date getMaxDate(Date... dates) {
Date destDate = null;
for (int i = 0; i < dates.length - 1; i++) {
destDate = (isAfter(dates[i], dates[i + 1]) ? dates[i] : dates[i + 1]);
}
return destDate;
}
/**
* 获取间隔天数之后的目标日期,如果目标日期是周末或节假日则顺延到工作日
* @param days 间隔天数
* @return targetDate 目标日期
*/
public static java.sql.Date getTargetDate(Integer days){
StringBuffer url = new StringBuffer();
url.append(ZhfyConfigUtil.getSysConfig(QXJSFWConsts.GET_ENDDATE.getConfKeyword()));
url.append(QXJSFWConsts.GET_ENDDATE.getUrl(new Object[] { DateUtil.getCurDateStr(DateUtil.PATTEN_DATE),days }));
try {
JSONObject jsonResult = JerseyCallerUtils.doGet(url.toString(), null);
return getDateFromTimestampStr(jsonResult.getString("result"));
} catch (Exception e) {
LoggerUtil.error("调用期限服务接口获取目标日期失败,url:"+url,e);
}
return null;
}
// public static void main(String[] args) {
// StringBuffer url = new StringBuffer();
// url.append("http://172.16.33.85:8080/qxjs/api/service/qxfw/getEndDateTime?date=2017-08-28&days=30");
// JSONObject jsonResult = JerseyCallerUtils.doGet(url.toString(), null);
// String b = jsonResult.getString("result");
// java.sql.Date a = getDateFromTimestampStr(b);
// System.out.println("66666" + a.toString());
// }
private static java.sql.Date getDateFromTimestampStr(String timestampStr) {
String sDate = "";
try {
SimpleDateFormat sdfTimestamp = new SimpleDateFormat(PATTEN_TIMESTAMP, Locale.UK);
Date date = sdfTimestamp.parse(timestampStr);
SimpleDateFormat sdf = new SimpleDateFormat(PATTEN_DATE);
sDate = sdf.format(date);
} catch (ParseException e) {
LoggerUtil.error("日期格式转换出错",e);
}
return java.sql.Date.valueOf(sDate);
}
/**
* 获取日期的yyyyMMddHHmmss格式字符串
* @param date
* @return
*/
public static String getyyyyMMddHHmmssByDate(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String result = "";
if (date==null) {
return result.toString();
}
result = sdf.format(date);
return result;
}
/**
* 获取日期的格式字符串
* @param date
* @return
*/
public static String getStrByDate(Date date,String partter){
SimpleDateFormat sdf = new SimpleDateFormat(partter);
String result = "";
if (date==null) {
return result.toString();
}
result = sdf.format(date);
return result;
}
/**
* 根据日期字符串获取当日0点日期字符串
* @param dateString
* @return
*/
public static String dateStringToStartDateString(String dateString){
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(PATTEN_DATETIME);
try {
date = sdf.parse(dateString);
} catch (ParseException e) {
LoggerUtil.error("日期转换失败",e);
}
return DateFormatUtils.format(date, "yyyy-MM-dd 00:00:00");
}
/**
* 根据日期字符串获取当日23:59:59点日期字符串
* @param dateString
* @return
*/
public static String dateStringToEndDateString(String dateString){
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(PATTEN_DATETIME);
try {
date = sdf.parse(dateString);
} catch (ParseException e) {
LoggerUtil.error("日期转换失败",e);
}
return DateFormatUtils.format(date, "yyyy-MM-dd 23:59:59");
}
}
其他需要资料:
使用dataUtils需要用Date和Joda-Time里的DATe Time的转换