用Java获取当前的开始和结束日期 – (周一至周日)

今天是2014-04-06(星期日)。

我使用以下代码得到的输出是:

Start Date = 2014-04-07 End Date = 2014-04-13 

这是我想要的输出:

 Start Date = 2014-03-31 End Date = 2014-04-06 

我怎样才能做到这一点?

这是我到目前为止完成的代码:

 // Get calendar set to current date and time Calendar c = GregorianCalendar.getInstance(); System.out.println("Current week = " + Calendar.DAY_OF_WEEK); // Set the calendar to monday of the current week c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); System.out.println("Current week = " + Calendar.DAY_OF_WEEK); // Print dates of the current week starting on Monday DateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); String startDate = "", endDate = ""; startDate = df.format(c.getTime()); c.add(Calendar.DATE, 6); endDate = df.format(c.getTime()); System.out.println("Start Date = " + startDate); System.out.println("End Date = " + endDate); 

使用Java 8更新了答案

使用Java 8并保持与以前相同的原则(一周的第一天取决于您的Locale ),您应该考虑使用以下内容:

获取特定Locale的第一个和最后一个DayOfWeek

 final DayOfWeek firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek(); final DayOfWeek lastDayOfWeek = DayOfWeek.of(((firstDayOfWeek.getValue() + 5) % DayOfWeek.values().length) + 1); 

查询本周的第一天和最后一天

 LocalDate.now(/* tz */).with(TemporalAdjusters.previousOrSame(firstDayOfWeek)); // first day LocalDate.now(/* tz */).with(TemporalAdjusters.nextOrSame(lastDayOfWeek)); // last day 

示范

考虑以下class

 private static class ThisLocalizedWeek { // Try and always specify the time zone you're working with private final static ZoneId TZ = ZoneId.of("Pacific/Auckland"); private final Locale locale; private final DayOfWeek firstDayOfWeek; private final DayOfWeek lastDayOfWeek; public ThisLocalizedWeek(final Locale locale) { this.locale = locale; this.firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek(); this.lastDayOfWeek = DayOfWeek.of(((this.firstDayOfWeek.getValue() + 5) % DayOfWeek.values().length) + 1); } public LocalDate getFirstDay() { return LocalDate.now(TZ).with(TemporalAdjusters.previousOrSame(this.firstDayOfWeek)); } public LocalDate getLastDay() { return LocalDate.now(TZ).with(TemporalAdjusters.nextOrSame(this.lastDayOfWeek)); } @Override public String toString() { return String.format( "The %s week starts on %s and ends on %s", this.locale.getDisplayName(), this.firstDayOfWeek, this.lastDayOfWeek); } } 

我们可以certificate其用法如下:

 final ThisLocalizedWeek usWeek = new ThisLocalizedWeek(Locale.US); System.out.println(usWeek); // The English (United States) week starts on SUNDAY and ends on SATURDAY System.out.println(usWeek.getFirstDay()); // 2018-01-14 System.out.println(usWeek.getLastDay()); // 2018-01-20 final ThisLocalizedWeek frenchWeek = new ThisLocalizedWeek(Locale.FRANCE); System.out.println(frenchWeek); // The French (France) week starts on MONDAY and ends on SUNDAY System.out.println(frenchWeek.getFirstDay()); // 2018-01-15 System.out.println(frenchWeek.getLastDay()); // 2018-01-21 

原创Java 7答案(过时)

只需使用:

 c.setFirstDayOfWeek(Calendar.MONDAY); 

说明:

现在,您在星期几第一天设置在Calendar.SUNDAY 。 这是一个取决于您的Locale

因此, 更好的选择是初始化您的Calendar指定您感兴趣的Locale
例如:

 Calendar c = GregorianCalendar.getInstance(Locale.US); 

…会给你当前的输出,同时:

 Calendar c = GregorianCalendar.getInstance(Locale.FRANCE); 

…会给你预期的输出。

好吧,看起来你得到了答案。 这是一个加载项,在Java 8及更高版本中使用java.time 。 (参见教程 )

 import java.time.DayOfWeek; import java.time.LocalDate; public class MondaySunday { public static void main(String[] args) { LocalDate today = LocalDate.now(); // Go backward to get Monday LocalDate monday = today; while (monday.getDayOfWeek() != DayOfWeek.MONDAY) { monday = monday.minusDays(1); } // Go forward to get Sunday LocalDate sunday = today; while (sunday.getDayOfWeek() != DayOfWeek.SUNDAY) { sunday = sunday.plusDays(1); } System.out.println("Today: " + today); System.out.println("Monday of the Week: " + monday); System.out.println("Sunday of the Week: " + sunday); } } 

使用时间调整器的另一种方法。

 import java.time.LocalDate; import static java.time.DayOfWeek.MONDAY; import static java.time.DayOfWeek.SUNDAY; import static java.time.temporal.TemporalAdjusters.nextOrSame; import static java.time.temporal.TemporalAdjusters.previousOrSame; public class MondaySunday { public static void main(String[] args) { LocalDate today = LocalDate.now(); LocalDate monday = today.with(previousOrSame(MONDAY)); LocalDate sunday = today.with(nextOrSame(SUNDAY)); System.out.println("Today: " + today); System.out.println("Monday of the Week: " + monday); System.out.println("Sunday of the Week: " + sunday); } } 

这就是我为获得当周的开始和结束日期所做的工作。

 public static Date getWeekStartDate() { Calendar calendar = Calendar.getInstance(); while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) { calendar.add(Calendar.DATE, -1); } return calendar.getTime(); } public static Date getWeekEndDate() { Calendar calendar = Calendar.getInstance(); while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) { calendar.add(Calendar.DATE, 1); } calendar.add(Calendar.DATE, -1); return calendar.getTime(); } 

我使用以下方法检查给定日期是否属于当前周

 public boolean isDateInCurrentWeek(Date date) { Date currentWeekStart, currentWeekEnd; Calendar currentCalendar = Calendar.getInstance(); currentCalendar.setFirstDayOfWeek(Calendar.MONDAY); while(currentCalendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) { currentCalendar.add(Calendar.DATE,-1);//go one day before } currentWeekStart = currentCalendar.getTime(); currentCalendar.add(Calendar.DATE, 6); //add 6 days after Monday currentWeekEnd = currentCalendar.getTime(); Calendar targetCalendar = Calendar.getInstance(); targetCalendar.setFirstDayOfWeek(Calendar.MONDAY); targetCalendar.setTime(date); Calendar tempCal = Calendar.getInstance(); tempCal.setTime(currentWeekStart); boolean result = false; while(!(tempCal.getTime().after(currentWeekEnd))) { if(tempCal.get(Calendar.DAY_OF_YEAR)==targetCalendar.get(Calendar.DAY_OF_YEAR)) { result=true; break; } tempCal.add(Calendar.DATE,1);//advance date by 1 } return result; } 
 Calendar privCalendar = Calendar.getInstance(); Date fdow, ldow; int dayofWeek = privCalendar.get ( Calendar.DAY_OF_WEEK ); Date fdow, ldow; if( dayofWeek == Calendar.SUNDAY ) { privCalendar.add ( Calendar.DATE, -1 * (dayofWeek - Calendar.MONDAY ) - 7 ); fdow = privCalendar.getTime(); privCalendar.add( Calendar.DATE, 6 ); ldow = privCalendar.getTime(); } else { privCalendar.add ( Calendar.DATE, -1 * (dayofWeek - Calendar.MONDAY ) ); fdow = privCalendar.getTime(); privCalendar.add( Calendar.DATE, 6 ); ldow = privCalendar.getTime(); }