3

以下は、特定の月の週の開始日と終了日を計算するために使用しているコードです。週の開始日が月曜日で、週末が日曜日であると想定します。たとえば、2013年1月は5週間になります。月が日曜日で始まる場合-その日は無視してください

2013年1月第1週-2012年12月31日から2013年1月6日第2週-2013年1月7日から2013年1月13日第3週-2013年1月14日から2013年1月20日第4週-1月21日-2013年から2013年1月27日まで第5週-2013年1月28日から2013年2月3日まで

public static void main(String[] args) {
    List<List<String>> weekdates = getNumberOfWeeks(2013, Calendar.JULY);
    for(List<String> weekDatesLoop:weekdates){
        System.out.println("Start day: "+weekDatesLoop.get(0).toString());
        System.out.println("End day: "+weekDatesLoop.get(1).toString());
    }
  }
public static List<List<String>> getNumberOfWeeks(int year, int month) {
        System.out.println("Month Id: "+month);
        month = month-1;
        System.out.println("Month Id: " + month);
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        List<List<String>> weekdates = new ArrayList<List<String>>();

        List<String> dates = new ArrayList<String>();
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, month);
        c.set(Calendar.DAY_OF_MONTH, 1);
        dates.add(format.format(c.getTime()));
        //int numOfWeeksInMonth = 1;
        while (c.get(Calendar.MONTH) == month) {
          //System.out.println(c.get(Calendar.DAY_OF_WEEK) );

          if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
            dates.add(format.format(c.getTime()));
            weekdates.add(dates);
          }
          else if (c.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
            dates = new ArrayList<String>();
            dates.add(format.format(c.getTime()));
            //numOfWeeksInMonth++;
          }
          c.add(Calendar.DAY_OF_MONTH, 1);
        }
        if(dates.size() < 2){
          c.add(Calendar.DAY_OF_MONTH, -1);
          dates.add(format.format(c.getTime()));
          weekdates.add(dates);
        }
        System.out.println(weekdates);
        return weekdates;
      }

私はまだこれに取り組んでいます。誰かがこれを修正するのを手伝ってくれますか?

4

3 に答える 3

2

何年も前にJSR310で定義された最新のjava.timeクラスに取って代わられたひどい日時クラスを使用しています。この作業は今でははるかに簡単です。

YearMonth

YearMonthクラスは全体として特定の月を表します。Month列挙型を使用して月を指定します。

YearMonth ym = YearMonth.of( 2013 , Month.JANUARY ) ;

LocalDate

月の最初を取得します。

LocalDate firstOfMonth = ym.atDay( 1 ) ;

TemporalAdjuster

前の月曜日を取得するか、月曜日の場合はこの日付のままにします。

TemporalAdjuster ta = TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) ;
LocalDate previousOrSameMonday = firstOfMonth.with( ta ) ;

次に、一度に1週間ループします。

LocalDate endOfMonth = ym.atEndOfMonth() ;
LocalDate weekStart = previousOrSameMonday ; 
do {
    LocalDate weekStop = weekStart.plusDays( 6 ) ;
    System.out.println( "Week: " + weekStart + " to " + weekStop ) ;
    // Set up the next loop.
    weekStart = weekStart.plusWeeks( 1 ) ;
} while ( ! weekStart.isAfter( endOfMonth ) ) ;

このコードがIdeOne.comでライブで実行されていることを確認してください

週:2012年12月31日月曜日から2013年1月6日日曜日

週:2013年1月7日月曜日から2013年1月13日日曜日

週:2013年1月14日月曜日から2013年1月20日日曜日

週:2013年1月21日月曜日から2013年1月27日日曜日

週:2013年1月28日月曜日から2013年2月3日日曜日

ちなみに、週のISO 860標準定義について学び、使用を検討することをお勧めします。次に、 ThreeTen-ExtraライブラリのYearWeekクラスを使用します。

于 2019-08-06T21:27:44.967 に答える
1

考えられる解決策は、車輪の再発明を行わず、JodaTimeまたは同様のライブラリを使用することです。たとえば、でdayOfWeek()関数を使用してDateTime、必要な情報を取得できます。

于 2013-01-25T12:18:40.980 に答える
1

私は次のコードで答えを得る

List<List<String>> getNumberOfWeeks(int year, int month) {
        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
        List<List<String>> weekdates = new ArrayList<List<String>>();
        List<String> dates;
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, month);
        c.set(Calendar.DAY_OF_MONTH, 1);
        while (c.get(Calendar.MONTH) == month) {
                dates = new ArrayList<String>();
              while (c.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
                c.add(Calendar.DAY_OF_MONTH, -1);
              }
              dates.add(format.format(c.getTime()));
              c.add(Calendar.DAY_OF_MONTH, 6);
              dates.add(format.format(c.getTime()));
              weekdates.add(dates);
              c.add(Calendar.DAY_OF_MONTH, 1);
        }
        System.out.println(weekdates);
        return weekdates;
      }
于 2013-01-28T06:33:43.217 に答える