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

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

PHPz
PHPz

学习是最好的投资!

membalas semua(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);

  }

}
迷茫

Adalah disyorkan untuk menggunakan API masa baharu Java8, yang lebih mudah untuk dikendalikan

LocalDate localDate = LocalDate.parse("2016-09-15");
LocalDate nextSunday = localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));

Semudah itu... Ia tidak menyusahkan seperti dahulu Date API Anda mungkin perlu try catch atau menilai banyak situasi dengan sendirinya

Untuk kaedah enkapsulasi ini, boleh dikatakan bahawa Java8, sebagai versi Java terkini, telah menyepadukan gaya imperatif Java yang terdahulu ke dalam gaya deklaratif, dan kod itu lebih mudah dibaca

Ini adalah masa baharu API Parameter kaedah localDate.with kelas abstrak masa yang ditentukan Temporal ialah antara muka TemporalAdjuster, yang bermaksud objek semasa boleh melaraskan objek semasa mengikut pelaras khusus ini with menjana pelaras untuk melaraskan hari minggu itu. ...bermaksud yang seterusnya, parameter melepasi TemporalAdjusters.next bermakna Ahad DayOfWeek.SUNDAY

Jadi sangat mudah untuk dibaca

kod ini secara keseluruhannya. Apa yang anda lihat ialah apa yang anda dapat. Laraskan masa semasa localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)); mengikut pelaras (Ahad depan) dan kembalikan localDate.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan