月の最初と最後の日を取得する必要があるLocalDateがあります。それ、どうやったら出来るの?
例えば。13/2/2014
私が取得する必要があります1/2/2014
し、28/2/2014
中LOCALDATEのフォーマット。
Threeten LocalDateクラスを使用します。
月の最初と最後の日を取得する必要があるLocalDateがあります。それ、どうやったら出来るの?
例えば。13/2/2014
私が取得する必要があります1/2/2014
し、28/2/2014
中LOCALDATEのフォーマット。
Threeten LocalDateクラスを使用します。
回答:
APIは、ビジネス要件に厳密に一致するソリューションをサポートするように設計されました
import static java.time.temporal.TemporalAdjusters.*;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.with(firstDayOfMonth());
LocalDate end = initial.with(lastDayOfMonth());
ただし、ジョンのソリューションも問題ありません。
YearMonth
完全性のために、そして私の意見ではよりエレガントに、YearMonth
クラスのこの使用法を参照してください。
YearMonth month = YearMonth.from(date);
LocalDate start = month.atDay(1);
LocalDate end = month.atEndOfMonth();
今月の最初と最後の日は、次のようになります。
LocalDate start = YearMonth.now().atDay(1);
LocalDate end = YearMonth.now().atEndOfMonth();
LocalDate
with
メソッドと比較してそれの利点は何ですか?
LocalDate
最初にインスタンスを用意する必要はありません。
Jon Skeetsの答えは正しく、完全性のためにこのわずかに異なるソリューションを追加するだけで、私の賛成に値します。
import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.with(lastDayOfMonth());
誰が来た場合を探して、前の月の最初の日と、前の月の最後の日:
public static LocalDate firstDayOfPreviousMonth(LocalDate date) {
return date.minusMonths(1).withDayOfMonth(1);
}
public static LocalDate lastDayOfPreviousMonth(LocalDate date) {
return date.withDayOfMonth(1).minusDays(1);
}
これを試して、カスタム日付の表示を避け、現在の月の開始日と終了日を表示する必要がある場合は、次のようにしてください。
LocalDate start = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()-1);
LocalDate end = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()).plusMonths(1);
System.out.println("Start of month: " + start);
System.out.println("End of month: " + end);
結果:
> Start of month: 2019-12-01
> End of month: 2019-12-30
これを試して:
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.withDayOfMonth(initial.getMonthOfYear().getLastDayOfMonth(false));
System.out.println(start);
System.out.println(end);
欲求の出力を見つけることができますが、getLastDayOfMonthメソッドのパラメーターtrue / falseを処理する必要があります
そのパラメーターはうるう年を表します
getLastDayOfMonth
-簡単なアプローチについては私の答えを参照してください。
LocalDateクラスのみで実行する場合:
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = LocalDate.of(initial.getYear(), initial.getMonthValue(),1);
// Idea: the last day is the same as the first day of next month minus one day.
LocalDate end = LocalDate.of(initial.getYear(), initial.getMonthValue(), 1).plusMonths(1).minusDays(1);
@hermanソリューションの実装をここに示します
ZoneId americaLaPazZone = ZoneId.of("UTC-04:00");
static Date firstDateOfMonth(Date date) {
LocalDate localDate = convertToLocalDateWithTimezone(date);
YearMonth baseMonth = YearMonth.from(localDate);
LocalDateTime initialDate = baseMonth.atDay(firstDayOfMonth).atStartOfDay();
return Date.from(initialDate.atZone(americaLaPazZone).toInstant());
}
static Date lastDateOfMonth(Date date) {
LocalDate localDate = convertToLocalDateWithTimezone(date);
YearMonth baseMonth = YearMonth.from(localDate);
LocalDateTime lastDate = baseMonth.atEndOfMonth().atTime(23, 59, 59);
return Date.from(lastDate.atZone(americaLaPazZone).toInstant());
}
static LocalDate convertToLocalDateWithTimezone(Date date) {
return LocalDateTime.from(date.toInstant().atZone(americaLaPazZone)).toLocalDate();
}
LocalDateTime
ここで使用するクラスはまったく間違っています。貴重なゾーン/オフセット情報を破棄しています。
Date
は質問とは何の関係もないので、一般的には避けるべきです。
ZoneId.of("America/La_Paz")
。現在の日付では同じ結果が得られますが、おそらく過去の日付や将来の日付ではありません。