本篇文章为大家展示了如何在Java中调用joda日期格式化工具,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
1.基本介绍
Java自带日期格式化工具DateFormat ,但是DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat 限制在 ThreadLocal 中。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。因此,从日期、时间处理的所有实践来说,我强力推荐使用joda-time 库。
2.joda-time的使用
引入依赖
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10.5</version> </dependency>
编写测试类
public class DateUtils { public static final long SECOND = 1000; // 1秒 java已毫秒为单位 public static final long MINUTE = SECOND * 60; // 一分钟 public static final long HOUR = MINUTE * 60; // 一小时 public static final long DAY = HOUR * 24; // 一天 public static final long WEEK = DAY * 7; // 一周 public static final long YEAR = DAY * 365; // 一年 public static final String FORMAT_TIME = "yyyy-MM-dd HH:mm:ss"; // 默认时间格式 public static final String FORMAT_TIME_MINUTE = "yyyy-MM-dd HH:mm"; // 默认时间格式 public static final String FORTER_DATE = "yyyy-MM-dd"; // 默认日期格式 private static final Map<Integer, String> WEEK_DAY = new HashMap<Integer, String>); static { WEEK_DAY.put7, "星期六"); WEEK_DAY.put1, "星期天"); WEEK_DAY.put2, "星期一"); WEEK_DAY.put3, "星期二"); WEEK_DAY.put4, "星期三"); WEEK_DAY.put5, "星期四"); WEEK_DAY.put6, "星期五"); } /** * 获取当前系统时间 * * @return yyyy-MM-dd HH:mm:ss */ public static String getCurrentTime) { DateTime dt = new DateTime); String time = dt.toStringFORMAT_TIME); return time; } /** * 获取系统当前时间按照指定格式返回 * * @param pattern * yyyy/MM/dd hh:mm:a * @return */ public static String getCurrentTimePatternString pattern) { DateTime dt = new DateTime); String time = dt.toStringpattern); return time; } /** * 获取当前日期 * * @return */ public static String getCurrentDate) { DateTime dt = new DateTime); String date = dt.toStringFORTER_DATE); return date; } /** * 获取当前日期按照指定格式 * * @param pattern * @return */ public static String getCurrentDatePatternString pattern) { DateTime dt = new DateTime); String date = dt.toStringpattern); return date; } /** * 按照时区转换时间 * * @param date * @param timeZone * 时区 * @param parrten * @return */ @Nullable public static String formatDate date, TimeZone timeZone, String parrten) { if date == null) { return null; } SimpleDateFormat sdf = new SimpleDateFormatparrten); sdf.setTimeZonetimeZone); return sdf.formatdate); } /** * 获取指定时间 * * @param year * 年 * @param month * 月 * @param day * 天 * @param hour * 小时 * @param minute * 分钟 * @param seconds * 秒 * @return yyyy-MM-dd HH:mm:ss */ public static String getPointTimeInteger year, Integer month, Integer day, Integer hour, Integer minute, Integer seconds) { DateTime dt = new DateTimeyear, month, day, hour, minute, seconds); String date = dt.toStringFORMAT_TIME); return date; } /** * * @param year * 年 * @param month * 月 * @param day * 天 * @param hour * 小时 * @param minute * 分钟 * @param seconds * 秒 * @param parrten * 自定义格式 * @return parrten */ public static String getPointTimePatternInteger year, Integer month, Integer day, Integer hour, Integer minute, Integer seconds, String parrten) { DateTime dt = new DateTimeyear, month, day, hour, minute, seconds); String date = dt.toStringparrten); return date; } /** * 获取指定日期 * * @param year * @param month * @param day * @return */ public static String getPointDateInteger year, Integer month, Integer day) { LocalDate dt = new LocalDateyear, month, day); String date = dt.toStringFORTER_DATE); return date; } /** * 获取指定日期 返回指定格式 * * @param year * @param month * @param day * @param parrten * @return */ public static String getPointDatParrtenInteger year, Integer month, Integer day, String parrten) { LocalDate dt = new LocalDateyear, month, day); String date = dt.toStringparrten); return date; } /** * 获取当前是一周星期几 * * @return */ public static String getWeek) { DateTime dts = new DateTime); String week = null; switch dts.getDayOfWeek)) { case DateTimeConstants.SUNDAY: week = "星期日"; break; case DateTimeConstants.MONDAY: week = "星期一"; break; case DateTimeConstants.TUESDAY: week = "星期二"; break; case DateTimeConstants.WEDNESDAY: week = "星期三"; break; case DateTimeConstants.THURSDAY: week = "星期四"; break; case DateTimeConstants.FRIDAY: week = "星期五"; break; case DateTimeConstants.SATURDAY: week = "星期六"; default: break; } return week; } /** * 获取指定时间是一周的星期几 * * @param year * @param month * @param day * @return */ public static String getWeekPointInteger year, Integer month, Integer day) { LocalDate dts = new LocalDateyear, month, day); String week = null; switch dts.getDayOfWeek)) { case DateTimeConstants.SUNDAY: week = "星期日"; break; case DateTimeConstants.MONDAY: week = "星期一"; break; case DateTimeConstants.TUESDAY: week = "星期二"; break; case DateTimeConstants.WEDNESDAY: week = "星期三"; break; case DateTimeConstants.THURSDAY: week = "星期四"; break; case DateTimeConstants.FRIDAY: week = "星期五"; break; case DateTimeConstants.SATURDAY: week = "星期六"; break; default: break; } return week; } /** * 格式化日期 * * @param date * @return yyyy-MM-dd HH:mm:ss */ @Nullable public static String formatDate date) { if date == null) { return null; } SimpleDateFormat format = new SimpleDateFormatFORMAT_TIME); return format.formatdate); } /** * 格式化日期字符串 * * @param date * 日期 * @param pattern * 日期格式 * @return */ @Nullable public static String formatDate date, String pattern) { if date == null) { return null; } SimpleDateFormat format = new SimpleDateFormatpattern); return format.formatdate); } /** * 解析日期 * * @param date * 日期字符串 * @param pattern * 日期格式 * @return */ @Nullable public static Date parseString date, String pattern) { if date == null) { return null; } Date resultDate = null; try { resultDate = new SimpleDateFormatpattern).parsedate); } catch ParseException e) { } return resultDate; } /** * 解析日期yyyy-MM-dd HH:mm:ss * * @param date * 日期字符串 * @return */ @Nullable public static Date parseString date) { if date == null) { return null; } try { return new SimpleDateFormatFORMAT_TIME).parsedate); } catch ParseException e) { return null; } } /** * 解析日期 yyyy-MM-dd HH:mm:ss * * @param timestamp * @return */ public static String formatLong timestamp, String pattern) { String dateStr = ""; if null == timestamp || timestamp.longValue) < 0) { return dateStr; } try { Date date = new Datetimestamp); SimpleDateFormat format = new SimpleDateFormatpattern); dateStr = format.formatdate); } catch Exception e) { // ignore } return dateStr; } /** * 解析日期 yyyy-MM-dd HH:mm:ss * * @param timestamp * @return */ public static String formatLong timestamp) { String dateStr = ""; if null == timestamp || timestamp.longValue) < 0) { return dateStr; } try { Date date = new Datetimestamp); SimpleDateFormat format = new SimpleDateFormatFORMAT_TIME); dateStr = format.formatdate); } catch Exception e) { // ignore } return dateStr; } /** * 获取当前时间前几天时间,按指定格式返回 * * @param days * @return */ public static String forwardDayInteger days, String format) { DateTime dt = new DateTime); DateTime y = dt.minusDaysdays); return y.toStringformat); } /** * 获取当前时间前几天时间 * * @param days * @return */ public static Date forwardDayInteger days) { DateTime dt = new DateTime); DateTime y = dt.minusDaysdays); return y.toDate); } /** * 获取指定时间之后或者之前的某一天00:00:00 默认返回当天 * * @param days * @return */ public static Date day00Integer days, String date, String zimeZone) throws Throwable { DateTime dt; TimeZone timeZone; try { if isBlankzimeZone)) { timeZone = TimeZone.getDefault); } else { timeZone = TimeZone.getTimeZonezimeZone); } if isBlankdate)) { dt = new DateTime).withZoneDateTimeZone.forTimeZonetimeZone)).toLocalDateTime).toDateTime); } else { dt = new DateTimedate).withZoneDateTimeZone.forTimeZonetimeZone)).toLocalDateTime).toDateTime); } } catch Exception e) { throw new Throwablee); } DateTime y = dt.minusDaysdays).withHourOfDay0).withMinuteOfHour0).withSecondOfMinute0); return y.toDate); } /** * 获取指定时间之后或者之前的某一天23:59:59 默认返回当天 * * @param days * 偏移量 * @return */ public static Date day59Integer days, String date, String zimeZone) throws Throwable { DateTime dt; TimeZone timeZone; try { if isBlankzimeZone)) { timeZone = TimeZone.getDefault); } else { timeZone = TimeZone.getTimeZonezimeZone); } if isBlankdate)) { dt = new DateTime).withZoneDateTimeZone.forTimeZonetimeZone)).toLocalDateTime).toDateTime); } else { dt = new DateTimedate).withZoneDateTimeZone.forTimeZonetimeZone)).toLocalDateTime).toDateTime); } } catch Exception e) { throw new Throwablee); } DateTime y = dt.minusDaysdays).withHourOfDay23).withMinuteOfHour59).withSecondOfMinute59); return y.toDate); } /** * 计算两个时间相差多少天 * * @param startDate * @param endDate * @return */ @Nullable public static Integer diffDayDate startDate, Date endDate) { if startDate == null || endDate == null) { return null; } DateTime dt1 = new DateTimestartDate); DateTime dt2 = new DateTimeendDate); int day = Days.daysBetweendt1, dt2).getDays); return Math.absday); } /** * 获取某月之前,之后某一个月最后一天,24:59:59 * * @return */ public static Date lastDayDate date, Integer month) { DateTime dt1; if month == null) { month = 0; } if date == null) { dt1 = new DateTime).minusMonthsmonth); } else { dt1 = new DateTimedate).minusMonthsmonth); } DateTime lastDay = dt1.dayOfMonth).withMaximumValue).withHourOfDay23).withMinuteOfHour59) .withSecondOfMinute59); return lastDay.toDate); } /** * 获取某月月之前,之后某一个月第一天,00:00:00 * * @return */ public static Date firstDayDate date, Integer month) { DateTime dt1; if month == null) { month = 0; } if date == null) { dt1 = new DateTime).minusMonthsmonth); } else { dt1 = new DateTimedate).minusMonthsmonth); } DateTime lastDay = dt1.dayOfMonth).withMinimumValue).withHourOfDay0).withMinuteOfHour0) .withSecondOfMinute0); return lastDay.toDate); } public static Date addDayDate date, int offset) { DateTime dt1; if date == null) { dt1 = new DateTime).plusDaysoffset); return dt1.toDate); } dt1 = new DateTimedate).plusDaysoffset); return dt1.toDate); } /** * 传入日期时间与当前系统日期时间的比较, 若日期相同,则根据时分秒来返回 , 否则返回具体日期 * * @return 日期或者 xx小时前||xx分钟前||xx秒前 */ @Nullable public static String getNewUpdateDateStringDate now, Date createDate) { if now == null || createDate == null) { return null; } Long time = now.getTime) - createDate.getTime)); if time > 24 * 60 * 60 * 1000)) { return time / 24 * 60 * 60 * 1000) + "天前"; } else if time > 60 * 60 * 1000)) { return time / 60 * 60 * 1000) + "小时前"; } else if time > 60 * 1000)) { return time / 60 * 1000) + "分钟前"; } else if time >= 1000) { return time / 1000 + "秒前"; } return "刚刚"; } /** * * @Title: isBlank * @Description: TODO判断字符串是否为空或长度为0 或由空格组成) * @param @param str * @param @return 设定文件 * @return boolean 返回类型 * @throws */ public static boolean isBlankString str) { return str == null || str.trim).length) == 0); } public static void mainString[] args) throws Throwable { System.out.printlnlastDaynew Date),2)); System.out.printlnfirstDaynull,0)); TimeZone zone1=TimeZone.getTimeZone"GMT+8"); TimeZone zone2=TimeZone.getTimeZone"GMT-5"); System.out.printlnformatnew Date),zone1,FORMAT_TIME)); System.out.printlnformatnew Date),zone2,FORMAT_TIME)); System.out.printlnformatday000,"2017-5-11","GMT+0"))); System.out.printlnformatday000,"2017-5-11","GMT+8"))); System.out.printlnformatday000,"2017-5-11","GMT-8"))); Date date1 =parse"2017-05-11 17:53:52"); System.out.printlndiffDaydate1,new Date))); DateTime dateTime = new DateTime).withDayOfWeek1); DateTime dateTime1 = new DateTime).withDayOfWeek7).withTime0, 0, 0, 0); System.out.printlnformatdateTime.toDate))); System.out.printlnformatdateTime1.toDate))); System.out.printlnformatnew Date), "MM/dd")); } }
优点
1. 易于使用:Calendar让获取"正常的"的日期变得很困难,使它没办法提供简单的方法,而Joda-Time能够 直接进行访问域并且索引值1就是代表January。
2. 易于扩展:JDK支持多日历系统是通过Calendar的子类来实现,这样就显示的非常笨重而且事实 上要实现其它日历系统是很困难的。Joda-Time支持多日历系统是通过基于Chronology类的插件体系来实现。
3. 提供一组完整的功能:它打算提供 所有关系到date-time计算的功能.Joda-Time当前支持8种日历系统,而且在将来还会继续添加,有着比JDK Calendar更好的整体性能等等。