比如给一个时间 2016-09-06(周二)就能得到2016-09-04(2016-09-06这一周的周日)
学习是最好的投资!
public static String getFirstDayOfWeek(String date){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar cal = Calendar.getInstance(); try { cal.setTime(sdf.parse(date)); // Calendar默认周日为第一天, 所以设置为1 cal.set(Calendar.DAY_OF_WEEK, 1); // 如果要返回00点0分0秒 //cal.set(Calendar.HOUR_OF_DAY, 0); //cal.set(Calendar.MINUTE, 0); //cal.set(Calendar.SECOND, 0); //cal.set(Calendar.MILLISECOND, 0); } catch (ParseException e) { } return sdf.format(cal.getTime()); }
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); } }
建议用Java8的新时间API,操作起来比较方便
LocalDate localDate = LocalDate.parse("2016-09-15"); LocalDate nextSunday = localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
就这么简单...没有以前老Date API那么麻烦,可能还要try catch,或者判断很多种情况,很多情况交给JDK自己去处理吧,现在已经封装好了方法
Date API
try catch
对于这种封装好了的方法,可以说Java8作为Java最新版本,已经把Java以前的命令式风格融入了声明式风格,代码读取来也更易读了,localDate.with就是新时间API定义的时间抽象类Temporal的with方法,参数就是一个调整TemporalAdjuster接口,代表了当前对象可以根据这个具体的调整器来调整当前对象,TemporalAdjusters.next就是生成了一个调整器,调整星期的...表示下一个,参数传的DayOfWeek.SUNDAY,表示是周日
localDate.with
Temporal
with
TemporalAdjusters.next
DayOfWeek.SUNDAY
因此完整连起来读localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));这段代码就真的很容易了,所见即所得,把当前时间localDate按照调整器(下一个周日)进行调整并返回
localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
localDate
建议用Java8的新时间API,操作起来比较方便
就这么简单...没有以前老
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
按照调整器(下一个周日)进行调整并返回