есть ли способ получить все недели года плюс дни начала и окончания каждой недели? (с Joda-Time)
примерно так (2012):
неделя: 21 начало: 21.05.2012 окончание: 27.05.12
Спасибо за вашу помощь
есть ли способ получить все недели года плюс дни начала и окончания каждой недели? (с Joda-Time)
примерно так (2012):
неделя: 21 начало: 21.05.2012 окончание: 27.05.12
Спасибо за вашу помощь
Попробуй это:
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);
}
К вашему сведению, проект Joda-Time теперь находится в режим обслуживания, где команда рекомендует переход на java.time. См. учебник Oracle.
Вы можете определить неделю по-разному.
Я предполагаю, что вы имеете в виду стандартную неделю ISO 8601. Неделя номер 1 приходится на первый четверг года, начинается в понедельник, а год, основанный на неделе, состоит из 52 или 53 недель. Несколько дней в конце или начале календарного года могут попасть в другой недельный год.
Современный подход использует классы 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 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь в режим обслуживания, советует перейти на java.time.
Чтобы узнать больше, см. учебник по Oracle. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: JSR 310.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. . Этот проект является испытательным полигоном для возможных дополнений к java.time в будущем. Здесь вы можете найти несколько полезных классов, таких как Interval
a>, YearWeek
, YearQuarter
и подробнее.
Никогда не использовал Джода Тайм. Я бы сделал что-то вроде этого:
Я бы сделал это со стандартным API календаря Java. Возможно, Joda Time немного проще, я не знаю.