简体   繁体   中英

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

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

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.

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?

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 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM