tl; dr
accepted Answer by Hendrickxが正しい。ここに私はもう少し読みやすいと思う選択肢です。
LocalDate.of(2017 , Month.JANUARY , 1)
.with(TemporalAdjusters.previous(DayOfWeek.MONDAY))
TemporalAdjuster
TemporalAdjuster
インタフェースはjava.timeオブジェクトを操作するクラスを提供します。実装はTemporalAdjusters
クラスにあります。 previousOrSame
アジャスターは、前の曜日が見つかった場合、または曜日がすでにその曜日の場合は、同じ日付を使用します。
LocalDate target = LocalDate.of(2017 , Month.JANUARY , 1);
LocalDate ld = target.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
target.toString():2017年1月1日| ld.toString():2016年12月26日
あなたは常に日付が既に月曜日であったとしても、前の月曜日たい場合は、アジャスターprevious
を使用しています。
LocalDate ld = target.with(TemporalAdjusters.previous(DayOfWeek.MONDAY));
nextOrSame
アジャスターを使用して、週の終わりを取得します。
LocalDate nextOrSameSunday = target.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
文字列で曜日を表示できます。
ZoneId z = ZoneId.of("America/Montreal");
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(Locale.CANADA);
System.out.println("target: " + target.format(f) + " | ld: " + ld.format(f));
対象:2017年1月1日(日曜日)| ld:2016年12月26日月曜日
このcode live in IdeOne.comを参照してください。
enums,DayOfWeek
およびMonth
の使用にも注意してください。 Tutorialsを参照してください。 java.timeについて
java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.Date
、Calendar
、& SimpleDateFormat
など、面倒な古いlegacy日時クラスに取って代わります。
maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。
詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。
ここで、java.timeクラスを取得するには?
ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、Interval
、YearWeek
、YearQuarter
、moreなどの便利なクラスがあります。
「first.getFirstDayOfWeek() - first.get(Calendar.DAY_OF_WEEK)」は、週の初めに調整する方法はなぜですか? firstDayOfWeekが2(MONDAY)でdayOfWeekが1(SUNDAY)の場合、 '2 - 1 = + 1'となり、つまり* add * 1日になります。それはあなたが見ているものです。問題を解決するためにこのロジックを調整する方法を理解するために、あなたに任せておきます。 BTW:単にそれらの値を印刷すると、これはあなたに伝えられたでしょう。 – Andreas
問題は年の変更のためではありません。 DayOfWeekの数についてのあなたの理解は間違っています。 FirstDayOfWeekを月曜日に設定しても、月曜日の数は2で、DayOfWeekの数は2017年1月1日から日曜日/ 1です。したがって、2-1 = 1、2017年1月1日+1 = 2017年1月2日。2017年1月2日+6 = 2017年1月8日。 –
助けてくれてありがとう、私は特定の問題のためにより良い実装がされているので、Joda Time APIを使用します – Tuby