java工具Joda-Time 日期的处理

Joda-Time满足你所有关于日期的处理

简介

在日常的编程中,常常需要处理日期。但是使用 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";

    /**
     * 将日期转换为当天的开始时间
     * <p>例:2016-07-23 18:32:31转2016-07-23 00:00:00</p>
     * @param startDate
     * @return 
     */
    public static Date dateToStartTime(Date startDate) {
        if (null == startDate) {
            return null;
        }
        return new DateTime(startDate.getTime()).withTimeAtStartOfDay().toDate();
    }

    /**
     * 将日期转换为当天的结束时间
     * <p>例:2016-07-23 18:32:31转2016-07-23 23:59:59</p>
     * @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());
    }

    /**
     * 获取今日是在本周的索引
     * <p>例如:周一返回1;周日返回7</p>
     * @return index
     */
    public static int getCurDayInWeekIndex() {
        return new DateTime().getDayOfWeek();
    }

    /**
     * 获取指定日期是在其所在周的索引
     * <p>例如:周一返回1;周日返回7</p>
     * @return index
     */
    public static int getDayInWeekIndex(Date date) {
        return new DateTime(date.getTime()).getDayOfWeek();
    }

    /**
     * 得到指定日期在前/后N个星期中的对应日期
     * <p>weekNum>0表示获取N个星期后<br/>
     *    weekNum<0表示获取N个星期前</p>
     * @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个月中的对应日期
     * <p>monthNum>0表示获取N个月后<br/>
     *    monthNum<0表示获取N个月前</p>
     * @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个年中的对应日期
     * <p>monthNum>0表示获取N个年后<br/>
     *    monthNum<0表示获取N个年前</p>
     * @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天的对应日期
     * <p>dayNum>0表示获取N天后<br/>
     *    dayNum<0表示获取N天前</p>
     * @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分钟的对应日期
     * <p>dayNum>0表示获取N分钟后<br/>
     *    dayNum<0表示获取N分钟前</p>
     * @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的转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值