Date オブジェクトが与えられた場合、その月の最終日をどのように判断すればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/72381

  •  09-06-2019
  •  | 
  •  

質問

次のコードを使用しようとしていますが、間違った日が返されます。

Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.set(Calendar.MONTH, sampleDay.get(Calendar.MONTH)+1);
cal.set(Calendar.DAY_OF_MONTH, 0);
return cal.getTime();
役に立ちましたか?

解決

今月の日数を取得します。


Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
int noOfLastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

カレンダーを今月の最終日に設定します。


Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));

他のヒント

次の月の最初の日の日付オブジェクトを作成し、その日付オブジェクトから 1 日を引くだけです。

先生

YearMonth.from(
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
).atEndOfMonth()

java.time

質問とその他の回答では、古い時代遅れのクラスが使用されています。彼らは、 java.time Java 8 以降に組み込まれたクラス。見る オラクルのチュートリアル. 。機能の多くは Java 6 および 7 にバックポートされています。 ThreeTen バックポート さらに Android にも適応 スリーテンABP.

LocalDate

LocalDate class は、時刻やタイムゾーンを含まない日付のみの値を表します。これらのオブジェクトにはタイム ゾーンは保存されませんが、タイム ゾーンは現在の日付を決定する際に重要であることに注意してください。特定の瞬間において、日付はタイムゾーンによって世界中で変化します。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );  // 2016-06-25

YearMonth

と組み合わせる YearMonth 任意の月の最終日を決定するクラス。

YearMonth currentYearMonth = YearMonth.from( today );  // 2016-06
LocalDate lastDayOfCurrentYearMonth = currentYearMonth.atEndOfMonth();  // 2016-06-30

ちなみにどちらも LocalDate そして YearMonth 古い日時クラスで見られるスクリューボール 0 ~ 11 ではなく、予想どおりの月番号 (1 ~ 12) を使用してください。古い日付時刻クラスを非常に面倒で混乱させる原因となっている、設計上の不適切な決定の 1 つです。

TemporalAdjuster

もう 1 つの有効なアプローチは、 TemporalAdjuster。見る 正解 ピエール・アンリ.

calObject.getActualMinimum(calobject.DAY_OF_MONTH) を使用します。

見る Real の Java ハウツー 詳細については、こちらをご覧ください。

カレンダーを翌月の初日に設定しているようです。そのため、月の最後の日を取得するには、1 日を引くためにもう 1 行必要です。 サンプル日 にあります:

Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.roll(Calendar.MONTH, true);
cal.set(Calendar.DAY_OF_MONTH, 0);
cal.add(Calendar.DAY_OF_MONTH, -1);

一般に、この種のことを行うのは、次を使用する方がはるかに簡単です。 ジョーダタイム, 、例:

DateTime date = new DateTime(sampleDay.getTime());
return date.plusMonths(1).withDayOfMonth(0).minusDays(1).getMillis();

TemporalAdjuster

(相対的に) 新しい Java 日付 API, 、実際にはとても簡単です。

させて date ~の例になる LocalDate, 、 例えば :

LocalDate date = LocalDate.of(2018, 1, 22);

または

LocalDate date = LocalDate.now();

あるいはもちろん、データベースなどからユーザー入力として取得することもできます。

次に、の実装を適用します。 TemporalAdjuster インターフェイスが見つかりました TemporalAdjusters クラス:

LocalDate first = date.with(TemporalAdjusters.firstDayOfMonth());
LocalDate last = date.with(TemporalAdjusters.lastDayOfMonth());

を使用する場合は、 日付4j 図書館:

DateTime monthEnd = dt.getEndOfMonth();

これはうまく機能するはずだと思います:

Dim MyDate As Date = #11/14/2012#  'This is just an example date

MyDate = MyDate.AddDays(DateTime.DaysInMonth(MyDate.Year, MyDate.Month) - MyDate.Day)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top