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

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

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

你可以用

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

请注意,虽然getMonth已被弃用:

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

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

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

您将不得不编写自己的代码,因为每个业务的术语“Quarter”是不同的。 你不能只做这样的事情:

 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至少是float或double,而不是int:

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

此致,MS

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

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

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

 int month = Calendar.getInstance().get( Calendar.MONTH ) + 1; int quarter = month % 3 == 0? (month / 3): ( month / 3)+1; 

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

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

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

ThreeTen-EXTRA

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

其有用的课程包括:

  • Quarter
  • YearQuarter

本季度

要获取当前季度,请指定时区。 确定季度意味着确定日期。 确定日期意味着指定时区。 对于任何给定的时刻,日期在全球范围内因地区而异。 通过使用continent/regionforms的适当时区名称进行指定。 切勿使用3-4字母缩写,例如ESTIST

 ZoneId z = ZoneId.of( "America/Montreal" ); YearQuarter yq = YearQuarter.now( z ); 

给定一个java.util.Date

如果给定java.util.Date首先转换为java.time类型。 Instant类表示UTC时间轴上的一个时刻,分辨率为纳秒 。

 Instant instant = myUtilDate.toInstant(); 

分配时区以获取ZoneDateTime

 ZoneId z = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = instant.atZone( z ); 

ZonedDateTime生成ZonedDateTime

 YearQuarter yq = YearQuarter.from( zdt ); 

在整个代码中使用

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

使用java8你可以使用formatter:

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

withQuarter:2016 3 07