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