Joda Time - Получить все недели в году

есть ли способ получить все недели года плюс дни начала и окончания каждой недели? (с Joda-Time)

примерно так (2012):

неделя: 21 начало: 21.05.2012 окончание: 27.05.12

Спасибо за вашу помощь


person user1412715    schedule 23.05.2012    source источник


Ответы (3)


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

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);
}
person Shane    schedule 23.05.2012

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

К вашему сведению, проект Joda-Time теперь находится в режим обслуживания, где команда рекомендует переход на java.time. См. учебник Oracle.

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

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

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

Java.время

Современный подход использует классы 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() ;

…or…

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

Цикл для каждой недели года. Для каждого 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 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь в режим обслуживания, советует перейти на java.time.

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

Где получить классы java.time?

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

person Basil Bourque    schedule 10.07.2017

Никогда не использовал Джода Тайм. Я бы сделал что-то вроде этого:

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

Я бы сделал это со стандартным API календаря Java. Возможно, Joda Time немного проще, я не знаю.

person Andi Krusch    schedule 23.05.2012
comment
Я бы, вероятно, использовал таблицу базы данных, а не класс, но у вас есть правильная идея. - person Gilbert Le Blanc; 23.05.2012