import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import java.util.Date;
public class SWDateUtils {
private SWDateUtils() {
}
/**
* 返回截掉DayOfMonth以下的字段的Date,不修改原来的Date
* 比如 2015-07-27 13:12:12 -> 2015-07-27 00:00:00
*
* @param date
* @return
*/
public static Date truncateDayOfMonth(Date date) {
return new DateTime(date).dayOfMonth().roundFloorCopy().toDate();
}
/**
* 返回截掉Hour以下的字段的Date,不修改原来的Date
* 比如 2015-07-27 13:12:12 -> 2015-07-27 13:00:00
*
* @param date
* @return
*/
public static Date truncateHour(Date date) {
return new DateTime(date).hourOfDay().roundFloorCopy().toDate();
}
/**
* 返回截掉Minute以下的字段的Date,不修改原来的Date
* 比如 2015-07-27 13:12:12 -> 2015-07-27 13:12:00
*
* @param date
* @return
*/
public static Date truncateMinute(Date date) {
return new DateTime(date).minuteOfHour().roundFloorCopy().toDate();
}
/**
* 这一天是星期几,1:星期一,7:星期天
*
* @param date
* @return
*/
public static int getDayOfWeek(Date date) {
return new DateTime(date).getDayOfWeek();
}
/**
* 根据起始日期获得绝对日期
*
* @param startDate 起始日期
* @param weekOffset 相对周次,0-based
* @param dayOfWeek 星期几,1:星期一,7:星期天
* @param weekStartOnSunday 一周第一天是不是星期天,如果false则是星期一
* @return
*/
public static Date getDate(Date startDate, int weekOffset, int dayOfWeek, boolean weekStartOnSunday) {
// truncate掉小时及以后的数据
DateTime dateTime = new DateTime(truncateDayOfMonth(startDate));
if (!weekStartOnSunday) {
// 因为joda-time采用ISO标准,所以一周的第一天是礼拜一
// http://stackoverflow.com/questions/1801907/joda-time-first-day-of-week
return
dateTime
.withDayOfWeek(DateTimeConstants.MONDAY)
.plusWeeks(weekOffset)
.withDayOfWeek(dayOfWeek).toDate();
} else {
if (getDayOfWeek(startDate) == 7) {
dateTime = dateTime.plusWeeks(weekOffset);
if (dayOfWeek != 7) {
dateTime = dateTime.plusDays(dayOfWeek);
}
return dateTime.toDate();
} else {
dateTime = dateTime
.withDayOfWeek(DateTimeConstants.SUNDAY)
.minusWeeks(1) // 回到一周的第一天
.plusWeeks(weekOffset) // 增加周数
;
if (dayOfWeek != 7) {
dateTime = dateTime.plusDays(dayOfWeek);
}
return dateTime.toDate();
}
}
}
/**
* 获取那一天所在周的第一天
*
* @param date
* @param weekStartOnSunday 一周第一天是否礼拜天
* @return
*/
public static Date getFirstDateOfThatWeek(Date date, boolean weekStartOnSunday) {
return weekStartOnSunday ?
getDate(date, 0, DateTimeConstants.SUNDAY, weekStartOnSunday) :
getDate(date, 0, DateTimeConstants.MONDAY, weekStartOnSunday);
}
/**
* 获取那一天所在周的最后一天
*
* @param date
* @param weekStartOnSunday 一周第一天是否礼拜天
* @return
*/
public static Date getLastDateOfThatWeek(Date date, boolean weekStartOnSunday) {
return weekStartOnSunday ?
getDate(date, 0, DateTimeConstants.SATURDAY, weekStartOnSunday) :
getDate(date, 0, DateTimeConstants.SUNDAY, weekStartOnSunday);
}
}