47

给定一个 java.util.Date 对象,我该如何找到它所在的 Quarter?

假设 Q1 = 1 月 2 月 3 月,Q2 = 4 月、5 月、6 月等。

4

14 回答 14

64

从 Java 8 开始,可以使用java.time包中的类作为字段访问季度。

import java.time.LocalDate;
import java.time.temporal.IsoFields;

LocalDate myLocal = LocalDate.now();
quarter = myLocal.get(IsoFields.QUARTER_OF_YEAR);

在旧版本的 Java 中,您可以使用:

import java.util.Date;

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

请注意,尽管getMonth很早就被弃用了:

从 JDK 1.1 版开始,由 Calendar.get(Calendar.MONTH) 取代。

相反,您可以使用这样的Calendar对象:

import java.util.Calendar;
import java.util.GregorianCalendar;

Calendar myCal = new GregorianCalendar();
int quarter = (myCal.get(Calendar.MONTH) / 3) + 1;
于 2008-11-19T17:18:43.220 回答
52

在 Java 8 及更高版本中,java.time类有一个更简单的版本。使用LocalDateIsoFields

LocalDate.now().get(IsoFields.QUARTER_OF_YEAR)
于 2016-04-21T09:31:51.590 回答
14

您将不得不编写自己的代码,因为每个企业的“季度”一词都不同。你不能做类似的事情:

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";
于 2008-11-19T17:20:06.710 回答
10

由于宿舍是一个本地化(西方)概念,请指定一个 Locale 而不是使用平台默认值:

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;

这将避免在非西方日历上获得第十三个月(Calendar.UNDECIMBER),以及由于其较短的月份而导致的任何偏差。

于 2008-11-19T17:23:21.587 回答
5

如果你有

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);
于 2013-06-26T00:43:11.800 回答
3

使用 Joda 时间时,使用 Math.ceil() 函数:

double quarter = Math.ceil(new Double(jodaDate.getMonthOfYear()) / 3.0);
于 2016-08-18T12:40:41.203 回答
3
于 2016-09-02T19:11:25.840 回答
1

JFreeChart 有一个 Quarter 类。如果您好奇,请查看javadoc。如果您想查看实现,也可以从SourceForge获得源代码。

于 2008-11-19T17:30:26.470 回答
1

这里有很好的解决方案,但请记住,季度也可能因公司/行业而异。有时一个季度可能是不同的 3 个月。

您可能希望扩展或封装日历类以将其自定义为您的任务,而不是编写一些转换它的实用程序函数。您的应用程序在该领域可能已经足够复杂,以至于您会发现新日历类的其他用途——我保证您会很高兴您扩展或封装它,即使现在看起来很傻。

于 2008-11-19T18:06:09.020 回答
1
int month = Calendar.getInstance().get( Calendar.MONTH ) + 1;

int quarter = month % 3 == 0?  (month / 3): ( month / 3)+1;
于 2014-07-11T20:11:06.500 回答
1

确保thisMonth至少是浮点数或双精度数,而不是整数:

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

问候,女士

于 2015-04-24T17:47:11.197 回答
0

对我来说,我使用这种方法来表示字符串:

int quarter = (Calendar.getInstance().get(Calendar.MONTH) / 3); // 0 to 3
String[] mQuarterKey = {"qt1", "qt2", "qt3", "qt4"};
String strQuarter = mQuarterKey[quarter];
于 2015-11-12T13:09:01.460 回答
0

使用 java8 你可以使用格式化程序:

import java.time.format.DateTimeFormatter
import java.time.LocalDate

println("withQuarter: " + LocalDate.of("2016".toInt,"07".toInt,1).format(DateTimeFormatter.ofPattern("yyyyQMM")))

与季度:2016 3 07

于 2016-09-12T08:25:12.853 回答
0

我使用这种方法。

 public static Integer getQuarter(Date d){
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    int month = c.get(Calendar.MONTH);
    return (month /3)+1;
}
于 2019-10-01T07:46:53.067 回答