Получить дату понедельника текущей недели

у нас есть утилита, которая будет работать в любой день с понедельника по пятницу. Он обновит некоторое количество файлов внутри инструмента управления контентом. Последняя измененная дата, связанная с этим файлом, должна быть датой понедельника на этой неделе. Я написал следующую программу, чтобы получить дату текущей недели в понедельник. Но я все еще не уверен, будет ли это работать для всех сценариев. У кого-нибудь есть лучшее решение ?

Calendar c = Calendar.getInstance();
c.setTime(new Date());
System.out.println(c.get(Calendar.DAY_OF_MONTH));
System.out.println(c.get(Calendar.DAY_OF_WEEK));
int mondayNo = c.get(Calendar.DAY_OF_MONTH)-c.get(Calendar.DAY_OF_WEEK)+2;
c.set(Calendar.DAY_OF_MONTH,mondayNo);
System.out.println("Date "+c.getTime());

7 ответов


я настоятельно рекомендую использовать Джода Времени вместо этого (для всей вашей работы даты / времени, не только это):

// TODO: Consider time zones, calendars etc
LocalDate now = new LocalDate();
LocalDate monday = now.withDayOfWeek(DateTimeConstants.MONDAY);
System.out.println(monday);

обратите внимание, что, как вы использовали понедельник здесь, который является первым днем недели во времени Джоды, это всегда будет возвращаться более ранним днем (или в тот же день). Если вы выбрали среду (например), то это будет вперед в среду с понедельника или вторника. Вы всегда можете добавить или вычесть неделю, если вам нужна "следующая среда" или "предыдущая среда".

EDIT: если вы действительно хотите использовать java.утиль.Дата/календарь, вы можете использовать:

Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());

можно использовать Calendar.setFirstDayOfWeek чтобы указать, является ли неделя Понедельник-воскресенье или воскресенье-суббота; я верить установка дня недели будет оставаться в течение текущей недели-но проверить его.


tl; dr

LocalDate previousMonday = 
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
             .with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) );

java.время

оба java.утиль.Класс календаря и библиотека времени Joda были заменены java.время фреймворк, встроенный в Java 8 и более поздние версии. См.В Oracle Учебник. Большая часть java.функциональность времени была обратно портирована на Java 6 & 7 в ThreeTen-Backport и далее адаптированы к Android в ThreeTenABP.

на java.time.LocalDate класс представляет значение только даты без времени суток и без часового пояса.

для определения сегодняшней даты требуется часовой пояс, a ZoneId.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );

на TemporalAdjuster интерфейс (см. учебник)-это мощный, но простой способ манипулировать значениями даты и времени. The TemporalAdjusters класса (обратите внимание на множественное число) реализует некоторые очень полезные изменения. Здесь мы используем previous( DayOfWeek).

в handy DayOfWeek перечисление позволяет легко определить день недели.

LocalDate previousMonday = today.with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) );

если сегодня is в понедельник, и вы хотите использовать сегодня, а не неделю назад, называем previousOrSame.


о java.время

на java.время framework встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

на Joda Времени, теперь режим обслуживания, советует миграцию в java.время классы.

чтобы узнать больше, см. В Oracle Учебник. И search Stack Overflow для многих примеров и объяснений. Спецификация JSR 310.

вы may exchange java.время объекты непосредственно с вашей базой данных. Используйте драйвер JDBC соответствуют JDBC 4.2 или позже. Нет необходимости в строках, нет необходимости в java.sql.* классы.

где получить java.время занятий?

  • Java SE 8, Java SE 9, и позже
    • встроенный.
    • часть стандартного Java API с комплектной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • более поздние версии Android bundle реализации java.классы время.
    • для более раннего Android (ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). См.как использовать ThreeTenABP....

на ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательной площадкой для возможных будущих дополнений к java.время. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и больше.


следующие будут работать, включая месяцы упаковки:

Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setTime(new Date());
int today = c.get(Calendar.DAY_OF_WEEK);
c.add(Calendar.DAY_OF_WEEK, -today+Calendar.MONDAY);
System.out.println("Date "+c.getTime());

Если, однако, вы редактируете свое приложение в воскресенье (например. Воскресенье, 12 февраля), дата будет на следующий понедельник. Исходя из ваших требований (приложение будет работать только с понедельника по пятницу), это не должно стать проблемой.


как предложил Джон, календарь.установить способ работает... Я протестировал его как в случае понедельника в том же месяце, так и в другом месяце, используя следующий фрагмент :

Calendar c = Calendar.getInstance();
//ensure the method works within current month
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());
//go to the 1st week of february, in which monday was in january
c.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("Date " + c.getTime());
//test that setting day_of_week to monday gives a date in january
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());
//same for tuesday
c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
System.out.println("Date " + c.getTime());

результаты:

Date Mon Feb 13 10:29:41 CET 2012
Date Wed Feb 01 10:29:41 CET 2012
Date Mon Jan 30 10:29:41 CET 2012
Date Tue Jan 31 10:29:41 CET 2012

Как насчет использования Джода Времени библиотека... Взгляните на это ответ...


Если вы не хотите использовать время Joda, вы можете сделать это, чтобы найти недели - > (работает на Android)

public static ArrayList<String> getWeeks(int month) {

ArrayList<String> arrayListValues = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("MMMM d");

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.MONTH, month);

int day = calendar.get(Calendar.DAY_OF_WEEK);
while (day != 1) {
  calendar.add(Calendar.DATE, 1);
  day = calendar.get(Calendar.DAY_OF_WEEK);
}

calendar.add(Calendar.DATE, -14);
String y1 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 6);
String y2 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 1);
arrayListValues.add(y1 + " - " + y2);

 y1 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 6);
 y2 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 1);
arrayListValues.add(y1 + " - " + y2);



for (int i = 0; i < 10; i++) {

  y1 = sdf.format(calendar.getTime());
  calendar.add(Calendar.DATE, 6);
  y2 = sdf.format(calendar.getTime());
  calendar.add(Calendar.DATE, 1);
  arrayListValues.add(y1 + " - " + y2);
}

return arrayListValues;
}

Это не будет работать, если текущая неделя Понедельник месяц назад... Например, если сегодня пятница, 1 июня... Вероятно, вам лучше использовать свернуть метод...