本篇文章为大家展示了如何在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更好的整体性能等等。
