TLの代わりに
_calendar.set(year, (month - 1), 1);
; DR
LocalDate.now(ZoneId.of("Pacific/Auckland"))
.with(ChronoField.DAY_OF_MONTH , 1L)
詳細
getFirstDayOfWeek()は、すべての最初の日を取得します月
月の初めに最初の週が混乱しているようです。
月の最初は常に1
です。
第1週は、日曜日や月曜日などの曜日です。Calendar
クラスの週の最初の曜日の定義は、Locale
に応じて異なります。たとえば、北アメリカの多くでは、最初の日は一般的に日曜日です。ヨーロッパの多くでは、週の最初の日が月曜日です。
Locale
を指定しない場合、Calendar
クラスはJVMの現在のデフォルトロケールを暗黙的に適用します。あなたのデフォルトロケールでは、明らかに週の最初の日が月曜日です。私はあなたが番号2
を報告するので、それを推測します。int
定数Calendar.MONDAY
を検索すると、it is indeed a primitive int
of value 2
が見つかります。
避けレガシー日時クラス
Calendar
クラスは、多くの貧しい設計上の決定を持っています。私は、この曜日の変化する定義をそれらの1つと考えています。 Calendar
やDate
のような厄介な古い日時クラスを避ける理由の多くの1つ。これらのクラスは、現在、java.timeクラスに取って代わられています。 java.time
LocalDate
クラスを使用して
は、時間日の時間帯なしなし日付専用の値を表しています。
タイムゾーンは、日付を決定する際に重要です。任意の瞬間について、日付は地球の周りでゾーンごとに異なります。たとえば、Paris Franceの真夜中の数分後には、新しい日がありますが、まだ「昨日」はMontréal Québecです。
は、America/Montreal
、Africa/Casablanca
、又はPacific/Auckland
として、continent/region
の形式でproper time zone nameを指定します。 EST
またはIST
のような3〜4文字の略語は、ではなく、のように、標準化されておらず、ユニークではない(!)と使用しないでください。
ZoneId z = ZoneId.of("America/Montreal");
LocalDate today = LocalDate.now(z);
の(a)(b)は、特定のDayOfWeek
列挙型の日付を取得するにはTemporalAdjusters
で定義されたTemporalAdjuster
実装を使用し、あなたのための週の最初の日が何であるかを決定し、週の最初の日を取得するにはオブジェクト。
DayOfWeek firstDow = DayOfWeek.MONDAY ;
LocalDate ld = today.with(TemporalAdjusters.previousOrSame(firstDow)) ;
月の特定の日のLocalDate
を取得するには、with
メソッドを呼び出し、ChronoField.DAY_OF_MONTH
から列挙型のオブジェクトを渡します。
LocalDate firstOfMonth = today.with(ChronoField.DAY_OF_MONTH , 1L) ;
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クラスを取得するには?