7

プレーンJavaでは、月の最後の日曜日を取得するためのこのコードがあります。

Calendar getNthOfMonth(int n, int day_of_week, int month, int year) {
    Calendar compareDate = Date(1, month, year);
    compareDate.set(DAY_OF_WEEK, day_of_week);
    compareDate.set(DAY_OF_WEEK_IN_MONTH, n);
    return compareDate;
}
// Usage
Calendar lastSundayOfNovember = getNthOfMonth(-1, SUNDAY, NOVEMBER, 2012)

を使用して同じ結果を達成するためのクリーンでエレガントな方法は何Joda-Timeですか?

4

7 に答える 7

5
public class Time {
public static void main(String[] args) {
    System.out.println(getNthOfMonth(DateTimeConstants.SUNDAY, DateTimeConstants.SEP, 2012));
}


public static LocalDate getNthOfMonth(int day_of_week, int month, int year) {
    LocalDate date = new LocalDate(year, month, 1).dayOfMonth()  
             .withMaximumValue()
             .dayOfWeek()
             .setCopy(day_of_week);
    if(date.getMonthOfYear() != month) {
        return date.dayOfWeek().addToCopy(-7);
    }
    return date;
}
}
于 2012-09-11T12:56:22.803 に答える
5

あなたはそのようなことを試すことができます:

public class Foo {

  public static LocalDate getNthSundayOfMonth(final int n, final int month, final int year) {
    final LocalDate firstSunday = new LocalDate(year, month, 1).withDayOfWeek(DateTimeConstants.SUNDAY);
    if (n > 1) {
      final LocalDate nThSunday = firstSunday.plusWeeks(n - 1);
      final LocalDate lastDayInMonth = firstSunday.dayOfMonth().withMaximumValue();
      if (nThSunday.isAfter(lastDayInMonth)) {
        throw new IllegalArgumentException("There is no " + n + "th Sunday in this month!");
      }
      return nThSunday;
    }
    return firstSunday;
  }


  public static void main(final String[] args) {
    System.out.println(getNthSundayOfMonth(1, DateTimeConstants.SEPTEMBER, 2012));
    System.out.println(getNthSundayOfMonth(2, DateTimeConstants.SEPTEMBER, 2012));
    System.out.println(getNthSundayOfMonth(3, DateTimeConstants.SEPTEMBER, 2012));
    System.out.println(getNthSundayOfMonth(4, DateTimeConstants.SEPTEMBER, 2012));
    System.out.println(getNthSundayOfMonth(5, DateTimeConstants.SEPTEMBER, 2012));
  }
}

出力:

2012-09-02
2012-09-09
2012-09-16
2012-09-23
2012-09-30
于 2012-09-11T15:03:20.470 に答える
3

ジョーダと

日付があるとしましょう:

DateTime date = new DateTime(2017, 6, 1, 0, 0, 0);

`まず、その月が 31 日、30 日、28 日、または 29 日かどうかを知る必要があります。

int lastofMonth = date.dayOfMonth().getMaximumValue();

これから新しい日付を作成します。

DateTime endOfMonth = new DateTime(2017, 6, lastOfMonth, 0, 0, 0);

最終日が何曜日であるかを調べるには、次のようにします。

int whatDayIsLast = endOfMonth.getDayOfWeek();

これで、月の最後の日曜日になる日付を作成できます。

DateTime lastSunday = new DateTime(2017, 6, lastOfMonth - whatDayIsLast, 0, 0, 0);

私の例 (2017 年 6 月) では、結果は次のようになります。

DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd");
System.out.println(dtf.print(lastSunday);

2017-06-25

于 2018-02-17T06:44:23.783 に答える
2

// 次のメソッドは、指定された月と年の最後の日曜日を返します

public Date getLastSunday(int month, int year) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month + 1, 1);
    int dayOftheWeek = cal.get(Calendar.DAY_OF_WEEK);
    int val = dayOftheWeek == Calendar.SUNDAY ? -7: -(dayOftheWeek-1);
    cal.add(Calendar.DAY_OF_MONTH, val);
    return cal.getTime();
}

/// obj.getLastSunday(Calendar.OCTOBER, 2014);

于 2014-08-06T22:13:55.067 に答える
2
   static LocalDate getNthOfMonth(int n, int day_of_week, int month, int year)
   {
      if (n == -1)
      {
         return getNthOfMonth(0, day_of_week, month + 1, year);
      }
      final LocalDate compareDate = new LocalDate(year, month, 1);
      if (compareDate.getDayOfWeek() > day_of_week)
      {
         return compareDate.withDayOfWeek(day_of_week).plusDays(7 * n);   
      }
      else
      {
         return compareDate.withDayOfWeek(day_of_week).plusDays(7 * (n - 1));    
      }
   }  
于 2012-09-11T15:15:42.850 に答える
2

java.timeJava-8 APIを使用したソリューション

指定された年と月の最後の日曜日のローカル日付を取得します。

Java の最新の日時 APIでこれを実現するために、指定された年と月のTemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY)いずれかに引数として渡すことができます。LocalDate

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.temporal.TemporalAdjusters;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(getLastSundayOfMonth(2020, 12));
    }

    public static LocalDate getLastSundayOfMonth(int year, int month) {
        return YearMonth.of(year, month)
                .atEndOfMonth() //Returns a LocalDate at the end of the month
                .with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));
    }
}

出力:

2020-12-27

YearMonth#atEndOfMonth取得していましたLocalDate。これの代わりに、YearMonth#atDay使用することもできます。

指定された年と月の n 番目の曜日 (例: 2 番目の木曜日) のローカル日付を取得します。

指定された年と月のTemporalAdjusters#dayOfWeekInMonthいずれかに引数として渡すことができます。LocalDate

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.temporal.TemporalAdjusters;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(localDateOnNthDayOfWeekOfMonth(DayOfWeek.THURSDAY, 2, 2020, 12));
    }

    public static LocalDate localDateOnNthDayOfWeekOfMonth(DayOfWeek dayOfWeek, int ordinal, int year, int month) {
        return YearMonth.of(year, month)
                .atEndOfMonth() // Returns a LocalDate at the end of the month
                .with(TemporalAdjusters.dayOfWeekInMonth(ordinal, dayOfWeek));
    }
}

出力:

2020-12-10

Trail: Date Timeから Java-8 日時 API について学びます。

Java 6 または 7 ユーザーへの注意:

何らかの理由で、Java 6 または Java 7 に固執する必要がある場合は、ほとんどのjava.time機能を Java 6 & 7 にバックポートするThreeTen-Backportを使用できます。 Android プロジェクトと Android API レベルで作業している場合はまだ Java-8 に準拠していません。desugarで利用できる Java 8+ APIと Android プロジェクトで ThreeTenABP を使用する方法 を確認してください。

于 2020-12-27T17:46:41.037 に答える