6

特定の日が月のどの週に当たるか知りたいです。たとえば、2012年9月20日は9月の第4週に該当しますが、以下のコードでは3と表示されますが、これは正しくありません。システムは日数を7で割って出力を返しますが、これは必要ありません。Joda APIを検索しましたが、解決策が見つかりません。月の週、日が落ちることを理解する方法はありますか?

    Calendar ca1 = Calendar.getInstance();

    ca1.set(2012,9,20);

    int wk=ca1.get(Calendar.WEEK_OF_MONTH);
    System.out.println("Week of Month :"+wk);
4

6 に答える 6

8

これは2つの理由によるものです。

最初のものはこれです(APIから):

月または年の最初の週は、getFirstDayOfWeek()で始まり、少なくともgetMinimalDaysInFirstWeek()日を含む最も早い7日間として定義されます。

これのデフォルト値は異なります(私のものは4でした)が、これを好みの値に設定することができます

Calendar.setMinimalDaysInFirstWeek()

2番目の理由は、@Timmyが彼の回答で取り上げた理由です。コードを機能させるには、両方の変更を実行する必要があります。完全な実例:

public static void main(String[] args) {
    Calendar ca1 = Calendar.getInstance();
    ca1.set(2012, Calendar.SEPTEMBER, 20);
    ca1.setMinimalDaysInFirstWeek(1);
    int wk = ca1.get(Calendar.WEEK_OF_MONTH);
    System.out.println("Week of Month :" + wk);
}

このプリント

Week of Month :4
于 2012-09-21T10:15:44.240 に答える
3

月はゼロベースです。したがって、ca1.set(2012,9,20)は、実際にはカレンダーを10月に設定しています。

于 2012-09-21T10:17:01.807 に答える
1

適切な月が設定されていることを確認するには、Calendar-Classによって提供される月定数を使用してみてください。

于 2012-09-21T10:19:49.573 に答える
0

Jodaの時間で作業している人のために、これは私が使用しているものです:

/**
 * For a week starting from Sunday, get the week of the month assuming a
 * valid week is any week containing at least one day.
 * 
 * 0=Last,1=First,2=Second...5=Fifth
 */
private int getWeekOfMonth( MutableDateTime calendar )
{
    long time = calendar.getMillis();
    int dayOfMonth = calendar.getDayOfMonth();
    int firstWeekday;
    int lastDateOfMonth;
    int week;
    int weeksInMonth;

    calendar.setDayOfMonth( 1 );
    firstWeekday = calendar.getDayOfWeek();
    if (firstWeekday == 7)
    {
        firstWeekday = 0;
    }
    calendar.setHourOfDay( 0 );
    calendar.addMonths( 1 );
    calendar.addDays( -1 );
    lastDateOfMonth = calendar.getDayOfMonth();
    weeksInMonth = (int)Math.ceil( 1.0*(lastDateOfMonth + firstWeekday)/7 );
    week = (byte)(1 + (dayOfMonth + firstWeekday - 1)/7);
    week = (week == weeksInMonth)?0:week;
    calendar.setMillis( time );

    return week;
}
于 2016-07-23T02:57:06.867 に答える
0

私はこの質問に非常に遅れていますが、完全な答えが欠けていると感じています。つまり、週の解釈方法は、によって大きく異なる可能性がありますLocale

質問には、米国(または同様のLocale)の設定が必要なようです。これは、最初の週の最小日数として1を使用し、週の最初の日として日曜日を使用します。

質問とすべての回答はCalendar、最初の週の最小日数が4日、週の最初の日が月曜日であるデフォルトのインスタンスを取ります。

簡単なデモプログラムはこれを示しています:

public static void main(String[] args) {
    {
        System.out.println("--- ISO ---");
        Calendar calendar = Calendar.getInstance();
        System.out.println("First day of week        : " + calendar.getFirstDayOfWeek());
        System.out.println("Minimal days in 1st week : " + calendar.getMinimalDaysInFirstWeek());
        calendar.set(2012, Calendar.SEPTEMBER, 20);
        int wk = calendar.get(Calendar.WEEK_OF_MONTH);
        System.out.println("Week of Month : " + wk);
    }
    {
        System.out.println("--- USA ---");
        Calendar calendar = Calendar.getInstance(Locale.US);
        System.out.println("First day of week        : " + calendar.getFirstDayOfWeek());
        System.out.println("Minimal days in 1st week : " + calendar.getMinimalDaysInFirstWeek());
        calendar.set(2012, Calendar.SEPTEMBER, 20);
        int wk = calendar.get(Calendar.WEEK_OF_MONTH);
        System.out.println("Week of Month : " + wk);
    }
}

そして、それはこの出力をもたらします:

--- ISO ---
First day of week        : 2
Minimal days in 1st week : 4
Week of Month : 3
--- USA ---
First day of week        : 1
Minimal days in 1st week : 1
Week of Month : 4

結論

最初の週または最初の曜日の最小日数を手動で設定する必要はありません。正しいものを使用していることを確認してくださいLocale

追加

Jodaの時間はISO週間しかサポートしていませんでした。Java 8と新しいtimeAPI以降、次のように実行できます。

LocalDate localDate = LocalDate.of(2012, 9, 20);
TemporalField usWeekOfMonth = WeekFields.of(Locale.US).weekOfMonth();
TemporalField isoWeekOfMonth = WeekFields.ISO.weekOfMonth();
System.out.println("USA week of month " + usWeekOfMonth.getFrom(localDate));
System.out.println("ISO week of month " + usWeekOfMonth.getFrom(localDate));

出力:

USA week of month 4
ISO week of month 4

そして、フォーマッターにもサポートがあります:

DateTimeFormatter usDateTimeFormatter = DateTimeFormatter.ofPattern("W/MM")
        .withLocale(Locale.US);
System.out.println("USA formatter : " + usDateTimeFormatter.format(localDate));
DateTimeFormatter isoDateTimeFormatter = DateTimeFormatter.ofPattern("W/MM");
System.out.println("ISO formatter : " + isoDateTimeFormatter.format(localDate));

出力:

USA formatter : 4/09
ISO formatter : 3/09
于 2020-07-06T08:15:50.053 に答える
-1
class test {
    public static void main(String[] args){
        Calendar cal = Calendar.getInstance();      
        cal.set(2016, Calendar.AUGUST, 01);
        printDayOFWeek(cal, Calendar.MONDAY, 5);//prints monday on 5th week
    }
}

private static void printDayOFWeek(Calendar cal, int day, int whatweek) {
    cal.set(Calendar.DAY_OF_WEEK, day);//day = Mon, tue, wed,..etc
    cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, -1); //-1 return last week 

    Date last = cal.getTime();
    cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, whatweek);

    Date one = cal.getTime();
    if(one.before(last) || one.compareTo(last) ==0)
    {
      System.out.println(whatweek +"WEEK" + cal.getTime());
    }
}
于 2016-07-21T13:10:28.947 に答える