日期工具类
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.Period;
import org.joda.time.PeriodType;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class DateUtil {
/**
* 比较两个日期的年月日,忽略时分秒。
*
* @param d1
* @param d2
* @return 如果d1晚于d2返回大于零的值,如果d1等于d2返回0,否则返回一个负值。
*/
public static int compare(Date d1, Date d2) {
return new LocalDate(d1.getTime())
.compareTo(new LocalDate(d2.getTime()));
}
/**
* 将日期转换成Date对象,支持的格式为yyyyMMdd, yyyyMMddHHmmss或者yyyy-MM-dd, yyyy-MM-dd
* HH:mm:ss,日期分隔符为(-,/,\)中的任意一个, 时间分隔符为(:)。 如果传入的日期格式不正确将返回null。
*
* @param date
* @return 如果传入的日期格式正确将返回一个Date对象,否则返回null。
*/
public static Date toDate(String str) {
if (str == null
|| (str.length() != 8 && str.length() != 14
&& str.length() != 10 && str.length() != 19)) {
return null;
}
String pattern = null;
if (str.length() == 8) {
pattern = "yyyyMMdd";
} else if (str.length() == 14) {
pattern = "yyyyMMddHHmmss";
} else if (str.length() == 10 || str.length() == 19) {
if (str.contains("-")) {
pattern = "yyyy-MM-dd";
} else if (str.contains("/")) {
pattern = "yyyy/MM/dd";
} else if (str.contains("\\")) {
pattern = "yyyy\\MM\\dd";
}
if (str.length() == 19) {
pattern += " HH:mm:ss";
}
}
DateTimeFormatter dtf = DateTimeFormat.forPattern(pattern);
return DateTime.parse(str, dtf).toDate();
}
/**
* 按如下格式:yyyy-MM-dd 返回日期。
*
* @param date
* @return
*/
public static String toString(Date date) {
if (date == null) {
return null;
}
return new DateTime(date).toString("yyyy-MM-dd");
}
/**
* 按指定的格式返回日期。
*
* @param date
* @param pattern
* @return
*/
public static String toString(Date date, String pattern) {
if (date == null) {
return null;
}
return new DateTime(date).toString(pattern);
}
/**
* 按如下格式:yyyy-MM-dd HH:mm:ss 返回日期。
*
* @param date
* @return
*/
public static String toLongString(Date date) {
if (date == null) {
return null;
}
return new DateTime(date).toString("yyyy-MM-dd HH:mm:dd");
}
/**
* 按指定格式返回日期。
*
* @param date
* @param pattern
* @return
*/
public static String toLongString(Date date, String pattern) {
if (date == null) {
return null;
}
return new DateTime(date).toString(pattern);
}
/**
* 获取基准日期是开始日期后的第几周,0到7天为第一周,8到14到第二周,依此类推。
*
* @param begin
* 起始日期。
* @param datum
* 基准日期。
* @return 基准日期是开始日期后的第几周。
*/
public static int getWeeks(Date begin, Date datum) {
if (compare(begin, datum) > 0) {
return -1;
}
int days = getPeriod(begin, datum);
return days % 7 > 0 ? days / 7 + 1 : days / 7;
}
/**
* 计算周年。
*
* @param beginDate
* 起始日期。
* @param calculateDate
* 计算日。
* @return
*/
public static int getAnniversary(Date beginDate, Date calculateDate) {
DateTime start = new DateTime(beginDate);
DateTime end = new DateTime();
if (calculateDate != null) {
end = new DateTime(calculateDate);
}
Period p = new Period(start, end, PeriodType.years());
return p.getYears();
}
/**
* 计算两个日期之间的天数,参数null表示当前日期。如果date2为null,计算date1到当前时间的天数。
*
* @param date1
* @param date2
* @return
*/
public static int getPeriod(Date date1, Date date2) {
if (date1 == null && date2 == null) {
return 0;
}
DateTime start = new DateTime(date1);
DateTime end = new DateTime();
if (date2 != null) {
end = new DateTime(date2);
}
Period p = new Period(start, end, PeriodType.days());
return p.getDays();
}
/**
* 计算年龄
* @param birthday 出生日期
* @param calculateDate 计算日期(不填默认为当前日期)
* @return
*/
public static int getAgeByBirthday(Date birthday, Date calculateDate){
Calendar cal = Calendar.getInstance();
if (calculateDate != null) {
cal.setTime(calculateDate);
}
if (cal.before(birthday)) {
throw new IllegalArgumentException(
"The birthDay is before Now.It's unbelievable!");
}
int yearNow = cal.get(Calendar.YEAR);
int monthNow = cal.get(Calendar.MONTH) + 1;
int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
cal.setTime(birthday);
int yearBirth = cal.get(Calendar.YEAR);
int monthBirth = cal.get(Calendar.MONTH) + 1;
int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
int age = yearNow - yearBirth;
if (monthNow <= monthBirth) {
if (monthNow == monthBirth) {
if (dayOfMonthNow < dayOfMonthBirth) {
age--;
}
} else {
age--;
}
}
return age;
}
/**
* 获得本周星期日的日期
*
* @return
*/
public static Date getCurrentWeekday() {
int mondayPlus = getMondayPlus();
GregorianCalendar currentDate = new GregorianCalendar();
currentDate.add(GregorianCalendar.DATE, mondayPlus + 6);
Date monday = currentDate.getTime();
return monday;
}
/**
* 获得下周星期一的日期
*
* @return
*/
public static Date getNextMonday() {
int mondayPlus = getMondayPlus();
GregorianCalendar currentDate = new GregorianCalendar();
currentDate.add(GregorianCalendar.DATE, mondayPlus + 7);
Date monday = currentDate.getTime();
return monday;
}
/**
* 获得下周星期日的日期
*
* @return
*/
public static Date getNextSunday() {
int mondayPlus = getMondayPlus();
GregorianCalendar currentDate = new GregorianCalendar();
currentDate.add(GregorianCalendar.DATE, mondayPlus + 7 + 6);
Date monday = currentDate.getTime();
return monday;
}
/**
* 获得当前日期与本周日相差的天数
*
* @return
*/
private static int getMondayPlus() {
Calendar cd = Calendar.getInstance();
// 获得今天是一周的第几天,星期日是第一天,星期二是第二天......
int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK) - 1; // 因为按中国礼拜一作为第一天所以这里减1
if (dayOfWeek == 1) {
return 0;
} else if (dayOfWeek == 0) {
return -6;
} else {
return 1 - dayOfWeek;
}
}
/**
* 获取年份。
*
* @param date
* @return
*/
public static int getYear(Date date) {
return new DateTime(date).getYear();
}
/**
* @param date
* @return 实际月份的字面值,比Calendar返回的值多1。
*/
public static int getMonth(Date date) {
return new DateTime(date).getMonthOfYear();
}
/**
* @param date
* @return
*/
public static int getDayOfMonth(Date date) {
return new DateTime(date).getDayOfMonth();
}
/**
* @param date
* @return
*/
public static int getHour(Date date) {
return new DateTime(date).getHourOfDay();
}
/**
* @param date
* @return
*/
public static int getMunite(Date date) {
return new DateTime(date).getMinuteOfHour();
}
/**
* @param date
* @return
*/
public static int getSecond(Date date) {
return new DateTime(date).getSecondOfMinute();
}
}