如何发现给定日期的季度?

时间:2008-11-19 17:15:45

标签: java calendar

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

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

14 个答案:

答案 0 :(得分:47)

您可以使用

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

请注意,尽管getMonth已被弃用:

  

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

答案 1 :(得分:27)

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

try {
        holder.spinner.setSelection((getItem(viewpos)).getSelection(),false);
    } catch (Exception e) {

    }

答案 2 :(得分:12)

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

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

答案 3 :(得分:10)

由于季度是本地化(西方)概念,因此请指定区域设置而不是使用平台默认值:

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),以及因较短月份而导致的任何偏差。

答案 4 :(得分:4)

如果你有

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

答案 5 :(得分:3)

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

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

答案 6 :(得分:2)

确保thisMonth至少是float或double,而不是int:

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

此致 MS

答案 7 :(得分:1)

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

答案 8 :(得分:1)

这里有很好的解决方案,但请记住,季度可能会因公司/行业而有所变化。有时四分之一可能是不同的3个月。

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

TL;博士

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

ThreeTen-EXTRA

Answer by abdmob是正确的:使用java.time是明智之举。

此外,ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。

其有用的课程包括:

当前季度

要获取当前季度,请指定时区。确定季度意味着确定日期。确定日期意味着指定时区。对于任何给定的时刻,日期在全球范围内因地区而异。使用continent/region格式EST进行指定。切勿使用3-4个字母的缩写,例如ISTZoneId z = ZoneId.of( "America/Montreal" ); YearQuarter yq = YearQuarter.now( z );

java.util.Date

给定java.util.Date

如果首先将Instant instant = myUtilDate.toInstant(); 转换为java.time类型。 proper time zone name类代表Instant中时间轴上的一个时刻,分辨率为UTC

ZoneDateTime

指定时区以获得ZoneId z = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = instant.atZone( z );

YearQuarter

ZonedDateTime生成YearQuarter yq = YearQuarter.from( zdt );

YearQuarter

在整个代码中使用

你应该传递userId的实例,而不仅仅是数字或字符串。使用对象可提供类型安全性,确保有效值,并使您的代码更具自我文档。

答案 11 :(得分:0)

对我而言,我使用此方法进行字符串表示:

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

答案 12 :(得分:0)

使用java8你可以使用formatter:

function playPause() {
    if (myVideo.paused) {
        myVideo.play();
        myVideo.show();
    } else {
        myVideo.pause();
        myVideo.hide();
    }
}

withQuarter:2016 3 07

答案 13 :(得分:0)

我使用这种方法。

 public static Integer getQuarter(Date d){
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    int month = c.get(Calendar.MONTH);
    return (month /3)+1;
}