Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Joda Time - Get all weeks of a year

is there a way to get all weeks of a year plus start and ending days of every week ? (With Joda-Time)

something like this (2012) :

week : 21 start: 21.05.2012 ending : 27.05.12

Thanks for your help

like image 356
user1412715 Avatar asked May 23 '12 13:05

user1412715


3 Answers

Try this:

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);
}  

Note that the week numbers start at 52 and then go from 1 - 51, since Jan 1 isn't on a Sunday.

If instead you want to see the dates of each Monday-Sunday week:

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);
}
like image 71
Shane Avatar answered Sep 20 '22 16:09

Shane


Joda-Time is in maintenance mode

FYI, the Joda-Time project is now in maintenance mode, with the team advising migration to the java.time classes. See Tutorial by Oracle.

Define ‘week’

You can define a week in different ways.

I will assume you mean the standard ISO 8601 week. Week number 1 has the first Thursday of the year, starts on a Monday, and a week-based year has either 52 or 53 weeks. A few days at the end or beginning of the calendar year may land in the other week-based year.

java.time

The modern approach uses the java.time classes, and their extension found in the ThreeTen-Extra project.

From ThreeTen-Extra, use the YearWeek class.

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

Get the number of weeks in this week-based year, 52 or 53.

int weeks = start.lengthOfYear() ;

…or…

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

Loop for each week of the year. For each YearWeek, ask it to produce a LocalDate for the beginning and ending of that week.

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 ) ;
}

About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

Where to obtain the java.time classes?

  • Java SE 8, Java SE 9, and later
    • Built-in.
    • Part of the standard Java API with a bundled implementation.
    • Java 9 adds some minor features and fixes.
  • Java SE 6 and Java SE 7
    • Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
  • Android
    • The ThreeTenABP project adapts ThreeTen-Backport (mentioned above) for Android specifically.
    • See How to use ThreeTenABP….

The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

like image 22
Basil Bourque Avatar answered Sep 20 '22 16:09

Basil Bourque


Never used Joda Time. I would do something like this:

  1. Create a class that has the weeknumber and two DateTimes (start, end)
  2. Create a List of this class
  3. Iterate over the year (week per week) and save the current week in the list

That's the way I would do this with the standard java calendar api. Probably Joda Time is a little bit easier, I don't know.

like image 31
Andi Krusch Avatar answered Sep 18 '22 16:09

Andi Krusch