比如给一个时间 2016-09-06(周二)就能得到2016-09-04(2016-09-06这一周的周日)
建议用Java8的新时间API,操作起来比较方便
LocalDate localDate = LocalDate.parse("2016-09-15");
LocalDate nextSunday = localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
就这么简单...没有以前老Date API
那么麻烦,可能还要try catch
,或者判断很多种情况,很多情况交给JDK自己去处理吧,现在已经封装好了方法
对于这种封装好了的方法,可以说Java8作为Java最新版本,已经把Java以前的命令式风格融入了声明式风格,代码读取来也更易读了,localDate.with
就是新时间API定义的时间抽象类Temporal
的with
方法,参数就是一个调整TemporalAdjuster接口,代表了当前对象可以根据这个具体的调整器来调整当前对象,TemporalAdjusters.next
就是生成了一个调整器,调整星期的...表示下一个,参数传的DayOfWeek.SUNDAY
,表示是周日
因此完整连起来读localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
这段代码就真的很容易了,所见即所得,把当前时间localDate
按照调整器(下一个周日)进行调整并返回
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import java.util.Date;
public class SWDateUtils {
private SWDateUtils() {
}
/**
* 返回截掉DayOfMonth以下的字段的Date,不修改原来的Date <br>
* 比如 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 <br>
* 比如 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 <br>
* 比如 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);
}
}
4 回答1.2k 阅读✓ 已解决
4 回答1.2k 阅读✓ 已解决
1 回答2.5k 阅读✓ 已解决
2 回答704 阅读✓ 已解决
2 回答1.7k 阅读
2 回答1.6k 阅读
2 回答1.3k 阅读