アルゴリズム
日付を渡して前四半期の最終日を表す日付を取得するルーチンを作成する必要があります。確かに、それはメソッドの良い名前のように聞こえ、問題のより良い要約です: endingDateOfPreviousQuarter( someDate )
.
または、排他的境界ではなく包括的な境界を意味するstart
とを使用する独自の命名規則で、代わりに名前を付けます。stop
stopDateOfPreviousQuarter( someDate )
私はそれを一対の方法で行います。
startDateOfQuarter( someDate )
- monthOfYear()を呼び出して、渡された日付の月を抽出します。
- その月がどの四半期かを判断します (1 ~ 3、4 ~ 6、7 ~ 9、9 ~ 12 の間であるかどうかをテストします)。
- その四半期の開始日を取得します (以下のコードに示すように、コンストラクターに year & month & dayOfMonth を渡します)。
stopDateOfPreviousQuarter( someDate )
- 「startDateOfQuarter」メソッドを呼び出して、問題の日付を渡します。
- 返された開始日に、Joda-Time のメソッドminusDays(1)を呼び出します。
ほら、前四半期の最終日の日付があります。
ここでの主な考え方は、一般に、終了点を直接取得しようとするよりも、時間要素 の開始点を見つけてから を使用する方がよいということです。minus
時間、日、週、月、または四半期の始まりを取得します。これにより、うるう日、うるう秒†、夏時間(DST) の問題、どの月が 30 日か 31 日かを記憶する際のエラー、および 1 時間の終わりまたは 1 時間の終わりを判断するのが困難になるさまざまな解像度の小数秒の問題が回避されます。日。さらに、少なくとも私の経験では、期間の始まりに焦点を当てることで、日時についての考え方が明確になります。
情報
ISO 8601は四半期を認識しません。この wikiで言及されているように、「Q」を何らかの識別子と組み合わせて使用して、仕様を拡張する人もいます。
2011 年のこのディスカッションで言及されているように、 Joda-Time 2は四半期をサポートしていません。
ISO 8601 は、正確に 52 または 53週の定義を定義しています。Joda-Time は、 weekOfWeekYear で表されるように、その概念をサポートしています。一部の企業では、1 から 52/53 の範囲のサブセットによって四半期を定義しています。
または、その年の 3 か月目、6 か月目、9 か月目、12 か月目の終わりまでに四半期を定義することもできます。Joda-Time には、月番号を指定できる DateTime クラスのコンストラクターがあります。メソッドwithTimeAtStartOfDay()を使用して Joda-Time に 1 日の最初の瞬間を取得させることに注意してください。これは、すべてのタイム ゾーンのすべての日に午前 0 時があるわけではないためです。
org.joda.time.DateTimeZone parisDateTimeZone = org.joda.time.DateTimeZone.forID( "Europe/Paris" );
org.joda.time.DateTime q1Start = new org.joda.time.DateTime(2013, 1, 1, 0, 0, parisDateTimeZone ).withTimeAtStartOfDay();
org.joda.time.DateTime q2Start = new org.joda.time.DateTime(2013, 4, 1, 0, 0, parisDateTimeZone ).withTimeAtStartOfDay();
System.out.println( "Q1 begins in Paris FR: " + q1Start );
System.out.println( "Q2 begins in Paris FR: " + q2Start );
// When querying a database or comparing items in a collection to find Q1 data,
// Look for: (GreaterThanOrEqualTo q1Start) AND (LessThan q2Start)
絶対に時刻要素を含まない日付のみが必要な場合は、Joda-Time のLocalDateクラスを使用します。このクラスは、DateTimeクラスと同様に、 minusDays()メソッドを備えています。
ところで、単純な日付 (時刻なし) と日時のどちらを扱っているかを検討してください。たとえば、請求書には単純な日付のみが使用されていると考えるかもしれませんが、実際には、法律上および監査上の理由で記録する必要がある可能性のある時刻を含む、受領時に時計機で刻印されることがよくあります。また、通常、データベースは日付値を UTC に基づく日時として (タイム ゾーン オフセットなしで) 格納します。
† Joda-Time はうるう秒を無視しますが、私の主張は依然として有効です。