如何发现给定日期的季度?
给定一个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类具有更简单的版本。 使用LocalDate
和IsoFields
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/region
forms的适当时区名称进行指定。 切勿使用3-4字母缩写,例如EST
或IST
。
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