Получить начальную и конечную дату текущей недели в 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);
Ответы
Ответ 1
Обновленный ответ с использованием Java 8
Используя Java 8 и придерживаясь того же принципа, что и раньше (первый день недели зависит от вашего Locale
), вы должны рассмотреть следующее:
Получите первый и последний DayOfWeek
для определенного Locale
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);
}
}
Мы можем продемонстрировать его использование следующим образом:
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);
... даст вам ожидаемый результат.
Ответ 2
Хорошо, похоже, что ты получил свой ответ. Здесь добавление, используя java.time в Java 8 и более поздних версиях. (См. Tutorial)
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);
}
}
Ответ 3
Это то, что я сделал, чтобы начать и завершить дату текущей недели.
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();
}
Ответ 4
Я использовал ниже метод, чтобы проверить, не выпала ли данная дата на текущей неделе
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;
}
Ответ 5
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();
}