2016-06-14 4 views
3

У меня есть следующий код Joda-Time, который устанавливает день недели:как установить день недели, используя java8

LocalDateTime localDateTime = new LocalDateTime(2016, 1, 1, 20,39); 
LocalDateTime localDateTime1 = localDateTime.withDayOfWeek(7); 

Как я могу сделать то же самое с java.time? Я вижу, что нет setDayOfTheWeek:

LocalDateTime time; 
time.getDayOfWeek() 

ответ

2

У вас есть несколько способов сделать это:

LocalDateTime localDateTime = LocalDateTime.of(2016, 1, 1, 20, 39); 

LocalDateTime ldt1 = localDateTime.with(ChronoField.DAY_OF_WEEK, 7); 
LocalDateTime ldt2 = localDateTime.with(DayOfWeek.of(7)); 
//Or, more readable, as suggested by @AndyTurner 
LocalDateTime ldt3 = localDateTime.with(DayOfWeek.SUNDAY); 
2

Это имеет не setDayOfTheWeek, потому что LocalDateTime не является неизменным, так что не имеет сеттеров для изменения объекта. (Классы времени Joda также неизменяемы!).

Используйте это в Java 8:

LocalDateTime localDateTime = LocalDateTime.of(2016, 1, 1, 20,39); 
LocalDateTime localDateTime1 = localDateTime.with(DayOfWeek.SUNDAY); 
1

java.time API не имеет метода withDayOfWeek(DayOfWeek). Однако у него есть общий with(TemporalAccessor) метод, который может быть использован вместо:

LocalDateTime dt = base.with(DayOfWeek.WEDNESDAY); 

Однако это оставляет открытым вопрос о том, какой выбран среда (она фактически изменяет дату в пределах понедельника по воскресенье недели). Лучший способ заключается в использовании TemporalAdjuster, чтобы сделать его более явным:

import static java.time.DayOfWeek.WEDNESDAY; 
import static java.time.temporal.TemporalAdjusters.next; 

LocalDateTime dt = base.with(next(WEDNESDAY)); 

Это меняет дату на следующую среду после даты основания. См TemporalAdjusters понимать доступные варианты:

  • next(DayOfWeek)
  • nextOrSame(DayOfWeek)
  • previous(DayOfWeek)
  • previousOrSame(DayOfWeek)
  • firstInMonth(DayOfWeek)
  • lastInMonth(DayOfWeek)
  • dayOfWeekInMonth(int, DayOfWeek)