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";

    /**
     * 将日期转换为当天的开始时间
     * 

例: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的转换

你可能感兴趣的:(java)