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

java工具Joda-Time 日期的处理相关推荐

  1. java中常用的日期工具类

    java中常用的日期工具类 日期相关的类: package net.yto.ofclacct.core.util;import java.text.ParseException; import jav ...

  2. Java中joda日期格式化工具的使用

    Java中joda日期格式化工具的使用 本文已废弃,请看最新版本的博客:Java日期工具-Joda-Time和FastDateFormat 1.基本介绍 Java自带日期格式化工具DateFormat ...

  3. joda jar日期处理类的学习

    转载:http://www.open-open.com/lib/view/open1348032952724.html 任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点, ...

  4. Java 8时间和日期API 20例

    本文由  ImportNew -  Sandy 翻译自  javarevisited.欢迎加入 翻译小组.转载请见文末要求. 伴随lambda表达式.streams以及一系列小优化,Java 8 推出 ...

  5. 推荐一个好用的 Java 工具类库

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 最近博主看到了一款小而全的 Java 工具类库:Huto ...

  6. Java 8 中处理日期和时间示例

    在Java 8以前,日期和时间处理一直被广大java程序员抱怨太难用,首先是java.util和java.sql中,都包含Date类,如果要进行时间格式化,还需要java.text.DateForma ...

  7. 【Java】7.5 正则表达式 7.6 Java 8 新增的日期、时间格式器

    目录 Pattern类 Matcher类 Java 8 新增的日期.时间格式器 Pattern类 Pattern类的实例是将一个编译好的正则表达式封装起来.因此正则表达式字符串必须先被变异成Patte ...

  8. java 拼图_拼图推迟将Java 9的发布日期推迟到2017年

    java 拼图 由于Project Jigsaw的延迟,Java 9的发布日期被推迟到2017年 由于项目延迟的悠久历史,这可能不足为奇,但是看起来备受期待的拼图项目已被延迟. 再次. 好消息是,与上 ...

  9. 拼图推迟将Java 9的发布日期推迟到2017年

    由于Jigsaw项目的延迟,Java 9的发布日期被推迟到2017年 由于项目延迟的悠久历史,这可能不足为奇,但是看起来备受期待的拼图项目已被延迟. 再次. 好消息是,与上一次使用Java 8不同,它 ...

  10. java8的时间工具类_JAVA8日期工具类

    /*** Java8日期时间工具类 * *@authorJourWon * @date 2020/12/13*/ public classLocalDateUtils {/*** 显示年月日时分秒,例 ...

最新文章

  1. 2542513 - AS Java fails to start - Initialization of destination UMEBackendConnection failed
  2. php重置下标有什么用,怎么在PHP中删除空数组并重置数组键名
  3. linux系统 硬链接和软链接
  4. 服务器与本地文件共享文件夹,云服务器对本地服务器共享文件夹
  5. (字符串)字符串中首先出现两次的字符
  6. 计算机信息安全基础薄弱具体,信息安全工程师易错题精讲十三
  7. python自动化工具_AWD_Hunter, 一个基于Python2.7的AWD自动化工具
  8. NGINX 实现反向代理负载均衡服务器
  9. Visual Studio 单元测试之二---顺序单元测试
  10. Facebook前身 哈佛大学“选美“网站核心算法 -- ELO等级分制度(附源码)
  11. 怎么阻止html渲染页面,防止浏览器假死的一个HTML5方案
  12. 计算机英语(编程词汇大全)
  13. cat()函数的用法
  14. 机器学习项目泰坦尼克号问题陈述
  15. vue中用ref实现父子组件、孙组件、兄弟组件、非亲子孙组件互相调用的方法
  16. 2020最新版C/C++学习路线图--从C小白到C界精英
  17. Associations - 关联
  18. Latex指定表格某行的行高
  19. router.addRouters和router.addRoute
  20. 漂洋过海,与Splunk第一次近距离接触!

热门文章

  1. 针对发票管理中遇到的税务风险如何进行规避?
  2. CCF CTO Club 16期活动记事——走进腾讯,实现连接
  3. parquet java_Java操作parquet
  4. 手机上的悬浮球原来这么好用,我也是今天才知道,看完涨知识了
  5. ChatGPT背后真正的英雄:OpenAI首席科学家Ilya Sutskever的信仰之跃
  6. 组策略1-密码策略和IE主页锁定
  7. el-upload设置默认图片
  8. 【NYOJ】取石子系列总结(十一题全)
  9. python安装教程(2020最新)
  10. JavaScript仿新浪微博搜索框功能