Подтвердить что ты не робот

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

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

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());
4b9b3361

Ответ 1

Я бы настоятельно рекомендовал вместо этого использовать Joda Time (для всей вашей работы с датой и временем, а не только):

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

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

EDIT: Если вы действительно хотите использовать java.util.Date/Calendar, вы можете использовать:

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

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

Ответ 2

TL;DR

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

java.time

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

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

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

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

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

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

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

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


О java.time

Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые классы даты и времени legacy, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, находящийся сейчас в режиме обслуживания maintenance mode, рекомендует перейти на классы java.time.

Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите в Кару множество примеров и объяснений. Спецификация: JSR 310.

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

Где взять классы java.time?

  • Java SE 8, Java SE 9 и более поздние
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time перенесена на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • Более поздние версии Android связывают реализации классов java.time.
    • В более ранних версиях Android (& lt; 26) проект Three ThreeTenABP адаптировал ThreeTen-Backport (упомянутый выше). См. Как использовать ThreeTenABP….

Table of which java.time library to use with which version of Java or Android.

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

Ответ 3

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

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 февраля), дата будет на следующий понедельник. Исходя из ваших требований (приложение будет работать только с понедельника по пятницу), это не должно создавать проблем.

Ответ 4

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

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

Ответ 6

если вы не хотите использовать Joda Time, вы можете сделать это, чтобы найти недели → (работает на 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;
}

Ответ 7

Для версии Android 6.0 или терки используйте:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
int day = 1, month = 7, year = 2018;
Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.set(year, month, day);
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);  //change de day to monday
String dateMonday= sdf.format(c.getTime());

Для версии Android 5.1 или ниже она не работает должным образом, я создал свой собственный метод.

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
int day = 1, month = 7, year = 2018;
Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
//set the date with your date or the current date c.set(new Date());
c.set(year, month, day);

int diaSemana = c.get(Calendar.DAY_OF_WEEK);
for (int i = 0; i < 7; i++) {
 if (diaSemana != Calendar.MONDAY) {
     day--;
     c.set(year, month, day);
     diaSemana = c.get(Calendar.DAY_OF_WEEK);
     if (diaSemana == Calendar.MONDAY) break;
  } else {
    break;
 }
}
String dateMonday= sdf.format(c.getTime());

Ответ 8

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