Java如何根据一个时间,得到这个时间所在的这一周的周日?
PHPz
PHPz 2017-04-18 09:57:05
0
3
605

比如给一个时间 2016-09-06(周二)就能得到2016-09-04(2016-09-06这一周的周日)

PHPz
PHPz

学习是最好的投资!

Antworte allen(3)
黄舟
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自己去处理吧,现在已经封装好了方法

对于这种封装好了的方法,可以说Java8作为Java最新版本,已经把Java以前的命令式风格融入了声明式风格,代码读取来也更易读了,localDate.with就是新时间API定义的时间抽象类Temporalwith方法,参数就是一个调整TemporalAdjuster接口,代表了当前对象可以根据这个具体的调整器来调整当前对象,TemporalAdjusters.next就是生成了一个调整器,调整星期的...表示下一个,参数传的DayOfWeek.SUNDAY,表示是周日

因此完整连起来读localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));这段代码就真的很容易了,所见即所得,把当前时间localDate按照调整器(下一个周日)进行调整并返回

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage