web-dev-qa-db-ja.com

特定の日付の四半期を検出するにはどうすればよいですか?

Java.util.Dateオブジェクトが与えられた場合、どの四半期にあるかをどのように見つけることができますか?

Q1 = 1月2月3月、Q2 = 4月、5月、6月などを想定.

31
Allain Lalonde

使用できます

int quarter = (myDate.getMonth() / 3) + 1;

ただし、 getMonth は推奨されていません。

JDKバージョン1.1以降、Calendar.get(Calendar.MONTH)に置き換えられました。

47
Bill the Lizard

Java 8以降では、 Java.time クラスはよりシンプルなバージョンを持っています。 LocalDateIsoFields

LocalDate.now().get(IsoFields.QUARTER_OF_YEAR)
31
abdolence

「四半期」という用語はビジネスごとに異なるため、独自のコードを記述する必要があります。次のようなことはできません:

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";
12

四半期はローカライズされた(西側の)概念であるため、プラットフォームのデフォルトを使用するのではなく、ロケールを指定します。

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)が取得されなくなり、短い月が原因のスキューが回避されます。

10
erickson

あなたが持っている場合

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);
4
JAM

Joda時間を使用する場合は、Math.ceil()関数を使用します。

double quarter = Math.ceil(new Double(jodaDate.getMonthOfYear()) / 3.0);
3
Coltini

thisMonthが少なくともintではなくfloatまたはdoubleであることを確認してください。

String quarter = thisMonth/3 <= 1 ? "Q1" : thisMonth/3 <= 2 ? "Q2" : thisMonth/3 <= 3 ? "Q3" : "Q4";

よろしく、MS

2
Marco

JFreeChartにはQuarterクラスがあります。興味があれば、 javadoc を確認してください。実装をチェックアウトしたい場合、ソースは SourceForge からも入手できます。

1
Brendan Cashman

tl; dr

YearQuarter
.from(
    LocalDate.of( 2018 , 1 , 23 ) 
)

ThreeTen-Extra

abdmobによる回答 が正しい: Java.time を使用するのが賢明な方法です。

さらに、 ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。

その便利なクラスは次のとおりです。

今四半期

現在の四半期を取得するには、タイムゾーンを指定します。四半期の決定は、日付の決定を意味します。日付を決定することは、タイムゾーンを指定することを意味します。どのような場合でも、日付はゾーンごとに世界中で異なります。 continent/regionの形式で 適切なタイムゾーン名 を使用して指定します。 ESTISTなどの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のインスタンスを渡す必要があります。オブジェクトを使用すると、型の安全性が確保され、有効な値が確保され、コードがより自己文書化されます。

1
Basil Bourque
int month = Calendar.getInstance().get( Calendar.MONTH ) + 1;

int quarter = month % 3 == 0?  (month / 3): ( month / 3)+1;
1
user3830848

ここでは良い解決策ですが、企業/業界によっても四半期が変わる可能性があることを忘れないでください。場合によっては、四半期が異なる3か月になることがあります。

おそらく、カレンダークラスを変換またはカプセル化して、それを変換するユーティリティ関数を記述するのではなく、タスクに合わせてカスタマイズする必要があります。アプリケーションはおそらくその領域で十分に複雑であるため、新しいカレンダークラスの他の用途を見つけることができます。今はばかげているように見えても、拡張したりカプセル化したりして喜んでいただけると思います。

1
Bill K

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

0
nexoma

私にとっては、このメソッドを文字列表現に使用しました。

int quarter = (Calendar.getInstance().get(Calendar.MONTH) / 3); // 0 to 3
String[] mQuarterKey = {"qt1", "qt2", "qt3", "qt4"};
String strQuarter = mQuarterKey[quarter];
0
Keiichi