Java.util.Dateオブジェクトが与えられた場合、どの四半期にあるかをどのように見つけることができますか?
Q1 = 1月2月3月、Q2 = 4月、5月、6月などを想定.
使用できます
int quarter = (myDate.getMonth() / 3) + 1;
ただし、 getMonth は推奨されていません。
JDKバージョン1.1以降、Calendar.get(Calendar.MONTH)に置き換えられました。
「四半期」という用語はビジネスごとに異なるため、独自のコードを記述する必要があります。次のようなことはできません:
Calendar c = /* get from somewhere */
int month = c.get(Calendar.MONTH);
return (month >= Calendar.JANUARY && month <= Calendar.MARCH) ? "Q1" :
(month >= Calendar.APRIL && month <= Calendar.JUNE) ? "Q2" :
(month >= Calendar.JULY && month <= Calendar.SEPTEMBER) ? "Q3" :
"Q4";
四半期はローカライズされた(西側の)概念であるため、プラットフォームのデフォルトを使用するのではなく、ロケールを指定します。
Calendar cal = Calendar.getInstance(Locale.US);
/* Consider whether you need to set the calendar's timezone. */
cal.setTime(date);
int month = cal.get(Calendar.MONTH); /* 0 through 11 */
int quarter = (month / 3) + 1;
これにより、西暦以外のカレンダーで13か月目(Calendar.UNDECIMBER)が取得されなくなり、短い月が原因のスキューが回避されます。
あなたが持っている場合
private static final int[] quarters = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4};
次に、現在のquarter
は
private static final int thisQuarter = quarters[thisMonth];
ここで、thisMonth
は
private static final int thisMonth = cal.get(Calendar.MONTH);
Joda時間を使用する場合は、Math.ceil()関数を使用します。
double quarter = Math.ceil(new Double(jodaDate.getMonthOfYear()) / 3.0);
thisMonth
が少なくともintではなくfloatまたはdoubleであることを確認してください。
String quarter = thisMonth/3 <= 1 ? "Q1" : thisMonth/3 <= 2 ? "Q2" : thisMonth/3 <= 3 ? "Q3" : "Q4";
よろしく、MS
JFreeChartにはQuarterクラスがあります。興味があれば、 javadoc を確認してください。実装をチェックアウトしたい場合、ソースは SourceForge からも入手できます。
YearQuarter
.from(
LocalDate.of( 2018 , 1 , 23 )
)
abdmobによる回答 が正しい: Java.time を使用するのが賢明な方法です。
さらに、 ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。
その便利なクラスは次のとおりです。
現在の四半期を取得するには、タイムゾーンを指定します。四半期の決定は、日付の決定を意味します。日付を決定することは、タイムゾーンを指定することを意味します。どのような場合でも、日付はゾーンごとに世界中で異なります。 continent/region
の形式で 適切なタイムゾーン名 を使用して指定します。 EST
やIST
などの3〜4文字の略語を使用しないでください。
ZoneId z = ZoneId.of( "America/Montreal" );
YearQuarter yq = YearQuarter.now( z );
Java.util.Date
が与えられた場合Java.util.Date
が指定されている場合、最初にJava.time型に変換します。 Instant
クラスは、 [〜#〜] utc [〜#〜] のタイムライン上の瞬間を表します。解像度は nanoseconds 。
Instant instant = myUtilDate.toInstant();
タイムゾーンを割り当てて、ZoneDateTime
を取得します。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
そのYearQuarter
からZonedDateTime
を生成します。
YearQuarter yq = YearQuarter.from( zdt );
単なる数字や文字列ではなく、YearQuarter
のインスタンスを渡す必要があります。オブジェクトを使用すると、型の安全性が確保され、有効な値が確保され、コードがより自己文書化されます。
int month = Calendar.getInstance().get( Calendar.MONTH ) + 1;
int quarter = month % 3 == 0? (month / 3): ( month / 3)+1;
ここでは良い解決策ですが、企業/業界によっても四半期が変わる可能性があることを忘れないでください。場合によっては、四半期が異なる3か月になることがあります。
おそらく、カレンダークラスを変換またはカプセル化して、それを変換するユーティリティ関数を記述するのではなく、タスクに合わせてカスタマイズする必要があります。アプリケーションはおそらくその領域で十分に複雑であるため、新しいカレンダークラスの他の用途を見つけることができます。今はばかげているように見えても、拡張したりカプセル化したりして喜んでいただけると思います。
java8では、フォーマッタを使用できます。
import Java.time.format.DateTimeFormatter
import Java.time.LocalDate
println("withQuarter: " + LocalDate.of("2016".toInt,"07".toInt,1).format(DateTimeFormatter.ofPattern("yyyyQMM")))
withQuarter:2016 07
私にとっては、このメソッドを文字列表現に使用しました。
int quarter = (Calendar.getInstance().get(Calendar.MONTH) / 3); // 0 to 3
String[] mQuarterKey = {"qt1", "qt2", "qt3", "qt4"};
String strQuarter = mQuarterKey[quarter];