1

現在の月のビューに表示する必要がある月の日を含む整数の配列を生成する必要があります。たとえば、現在の月のビューでは、最初の行の列に 8 月 26 日が表示されます。

ここに画像の説明を入力

Calendar および Date クラスを使用して Java で上記のグリッドに表示される整数を取得する最も簡単な方法は何ですか?

4

1 に答える 1

1

あなたの質問は私にとって興味深いので、解決策を作成しました:

import java.util.Calendar;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

public class CalendarTable {

    private static List<Integer> daysPositions = new LinkedList<Integer>();

    static {
        daysPositions.add( Calendar.SUNDAY );
        daysPositions.add( Calendar.MONDAY );
        daysPositions.add( Calendar.TUESDAY );
        daysPositions.add( Calendar.WEDNESDAY );
        daysPositions.add( Calendar.THURSDAY );
        daysPositions.add( Calendar.FRIDAY );
        daysPositions.add( Calendar.SATURDAY );
    }

    public static void viewCalendar( Date date ) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime( date );

        calendar.set( Calendar.DAY_OF_MONTH, 1 );
        // day of week for first date of month
        int firstDateOfMonthDay = calendar.get( Calendar.DAY_OF_WEEK );
        int weekOfFirstDate = calendar.get( Calendar.WEEK_OF_YEAR );

        int lastDateOfMonth = calendar.getActualMaximum( Calendar.DAY_OF_MONTH );
        calendar.set( Calendar.DAY_OF_MONTH, lastDateOfMonth );
        // day of week for last date of month
        int lastDateOfMonthDay = calendar.get( Calendar.DAY_OF_WEEK );
        int weekOfLastDate = calendar.get( Calendar.WEEK_OF_YEAR );

        calendar.roll( Calendar.MONTH, false );
        int lastDateOfPrevMonth = calendar.getActualMaximum( Calendar.DAY_OF_MONTH );

        int weeksToDisplay = weekOfLastDate - weekOfFirstDate + 1;
        int[] days = new int[weeksToDisplay * 7];

        int firstDayPosition = daysPositions.indexOf( firstDateOfMonthDay );

        // fill previous month
        int x = lastDateOfPrevMonth;
        for ( int i = firstDayPosition - 1; i >= 0; i-- ) {
            days[i] = x--;
        }

        // fill current month
        for ( int i = 1; i < lastDateOfMonth + 1; i++ ) {
            days[firstDayPosition - 1 + i] = i;
        }

        // fill next month
        int j = 1;
        for ( int i = lastDateOfMonth + firstDayPosition; i < days.length; i++ ) {
            days[i] = j++;
        }

        // display calendar
        // ( here you may extract data into your structure )
        for ( int i = 0; i < days.length; i++ ) {
            if ( i % 7 == 0 ) {
                System.out.println();
            }
            System.out.print( days[i] + "\t" );
        }
    }

    public static void main( String[] args ) {
        viewCalendar( new Date() );
    }

}

実行後、出力が得られます (たとえば、現在の月のビュー)。

26  27  28  29  30  31  1   
2   3   4   5   6   7   8   
9   10  11  12  13  14  15  
16  17  18  19  20  21  22  
23  24  25  26  27  28  29  
30  1   2   3   4   5   6

また、一部のカレンダーでは、週の最初の曜日が月曜日であるため、次のように入力できますdaysPositions

    static {
        daysPositions.add( Calendar.MONDAY );
        daysPositions.add( Calendar.TUESDAY );
        daysPositions.add( Calendar.WEDNESDAY );
        daysPositions.add( Calendar.THURSDAY );
        daysPositions.add( Calendar.FRIDAY );
        daysPositions.add( Calendar.SATURDAY );
        daysPositions.add( Calendar.SUNDAY ); // move Sunday to the end of week
    }

この操作の後、現在の月のビューでは次のようになります。

27  28  29  30  31  1   2   
3   4   5   6   7   8   9   
10  11  12  13  14  15  16  
17  18  19  20  21  22  23  
24  25  26  27  28  29  30  
1   2   3   4   5   6   7   
于 2012-09-05T10:18:09.863 に答える