2012-05-23 2 views

ответ

5

Попробуйте это:

SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy"); 
Period weekPeriod = new Period().withWeeks(1); 
DateTime startDate = new DateTime(2012, 1, 1, 0, 0, 0, 0); 
DateTime endDate = new DateTime(2013, 1, 1, 0, 0, 0, 0); 
Interval i = new Interval(startDate, weekPeriod); 
while(i.getEnd().isBefore(endDate)) { 
    System.out.println("week : " + i.getStart().getWeekOfWeekyear() 
      + " start: " + df.format(i.getStart().toDate()) 
      + " ending: " + df.format(i.getEnd().minusMillis(1).toDate())); 
    i = new Interval(i.getStart().plus(weekPeriod), weekPeriod); 
} 

Обратите внимание, что неделя номер начинается на 52, а затем перейти от 1 - 51, так как 1 Яна не в воскресенье.

Если вместо этого вы хотите, чтобы увидеть даты каждого понедельника по воскресенью недели:

SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy"); 
Period weekPeriod = new Period().withWeeks(1); 
DateTime startDate = new DateTime(2012, 1, 1, 0, 0, 0, 0); 
while(startDate.getDayOfWeek() != DateTimeConstants.MONDAY) { 
    startDate = startDate.plusDays(1); 
} 

DateTime endDate = new DateTime(2013, 1, 1, 0, 0, 0, 0); 
Interval i = new Interval(startDate, weekPeriod); 
while(i.getStart().isBefore(endDate)) { 
    System.out.println("week : " + i.getStart().getWeekOfWeekyear() 
      + " start: " + df.format(i.getStart().toDate()) 
      + " ending: " + df.format(i.getEnd().minusMillis(1).toDate())); 
    i = new Interval(i.getStart().plus(weekPeriod), weekPeriod); 
} 
+0

Ничего себе, спасибо большое! – user1412715

1

Никогда не Joda Время. Я хотел бы сделать что-то вроде этого:

  1. Создать класс, который имеет НомерНедели и два DateTimes (начало, конец)
  2. Создать список этого класса
  3. перебрать года (неделя в неделю) и сохранить текущую неделю в списке

Так я бы сделал это со стандартным java-календарем api. Вероятно, время Джоды немного легче, я не знаю.

+0

Я бы, вероятно, использовал таблицу базы данных, а не класс, но у вас есть правильная идея. –

0

Joda время находится в режиме обслуживания

FYI, проект Joda-Time теперь в maintenance mode, с командой консультирование по переходу на классы java.time. См. Tutorial by Oracle.

Определение «недели»

Вы можете определить в неделю по-разному.

Предполагаю, вы имеете в виду стандарт ISO 8601 week. Неделя № 1 имеет первый четверг года, начинается в понедельник, а недельный год - 52 или 53 недели. Несколько дней в конце или начале календарного года могут приземляться в другой недели.

java.time

Современный подход использует java.time классов, а также их расширение нашли в проекте ThreeTen-Extra.

От ThreeTen-Extra используйте класс YearWeek.

YearWeek start = YearWeek.of(2017 , 1) ; // First week of the week-based year 2017. 

Получите количество недель в этом году, 52 или 53 года.

int weeks = start.lengthOfYear() ; 

... или ...

int weeks = (start.is53WeekYear()) ? 53 : 52 ; 

Loop на каждую неделю года. Для каждого YearWeek попросите его создать LocalDate для начала и конца этой недели.

List<String> results = new ArrayList<>(weeks) ; 
YearWeek yw = start ; 
for(int i = 1 , i <] weeks , i ++) { 
    String message = "Week: " + yw + " | start: " + yw.atDay(DayOfWeek.MONDAY) + " | stop: " + yw.atDay(DayOfWeek.SUNDAY) ; 
    results.add(message) ; 
    // Prepare for next loop. 
    yw = yw.plusWeeks(1) ; 
} 

О java.time

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

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

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

Где получить классы 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

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

Смежные вопросы