[英]How can I generate custom quarters of a year given 1st date of first quarter?
[英]How do I discover the Quarter of a given Date?
给定一个 java.util.Date 对象,我该如何查找它所在的季度?
假设 Q1 = Jan Feb Mar,Q2 = Apr、May、Jun 等。
从 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;
您将不得不编写自己的代码,因为每个业务的“季度”一词都不同。 你不能做这样的事情:
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;
这将避免在非西方日历上获得第十三个月 (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);
YearQuarter
.from(
LocalDate.of( 2018 , 1 , 23 )
)
abdmob的答案是正确的:使用java.time是明智的选择。
此外, ThreeTen-Extra项目使用附加类扩展了 java.time。 该项目是未来可能添加到 java.time 的试验场。
其有用的类包括:
要获取当前季度,请指定时区。 确定一个季度意味着确定一个日期。 确定日期意味着指定时区。 对于任何给定时刻,日期因地区而异。 使用正确的时区名称以continent/region
形式指定。 切勿使用 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 );
生成YearQuarter
从ZonedDateTime
。
YearQuarter yq = YearQuarter.from( zdt );
您应该传递YearQuarter
实例,而不仅仅是数字或字符串。 使用对象提供类型安全性,确保有效值,并使您的代码更加自文档化。
java.time框架内置于 Java 8 及更高版本中。 这些类取代麻烦的老传统日期时间类,如java.util.Date
, Calendar
,和SimpleDateFormat
。
要了解更多信息,请参阅Oracle 教程。 并在 Stack Overflow 上搜索许多示例和解释。 规范是JSR 310 。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
您可以直接与您的数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC 驱动程序。 不需要字符串,不需要java.sql.*
类。
从哪里获得 java.time 类?
ThreeTen-Extra项目用额外的类扩展了 java.time。 该项目是未来可能添加到 java.time 的试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多。
确保thisMonth
至少是一个浮点数或双精度数,而不是一个整数:
String quarter = thisMonth/3 <= 1 ? "Q1" : thisMonth/3 <= 2 ? "Q2" : thisMonth/3 <= 3 ? "Q3" : "Q4";
问候,女士
int month = Calendar.getInstance().get( Calendar.MONTH ) + 1;
int quarter = month % 3 == 0? (month / 3): ( month / 3)+1;
JFreeChart 有一个 Quarter 类。 如果您好奇,请查看javadoc 。 如果您想查看实现,也可以从SourceForge获得源代码。
这里有很好的解决方案,但请记住,季度也可能因公司/行业而异。 有时一个季度可能是不同的 3 个月。
您可能希望扩展或封装日历类以根据您的任务自定义它,而不是编写一些实用程序函数来转换它。 您的应用程序在该领域可能足够复杂,您会发现新日历类的其他用途——我保证您会很高兴扩展或封装它,即使现在看起来很傻。
对我来说,我用这个方法来表示字符串:
int quarter = (Calendar.getInstance().get(Calendar.MONTH) / 3); // 0 to 3
String[] mQuarterKey = {"qt1", "qt2", "qt3", "qt4"};
String strQuarter = mQuarterKey[quarter];
使用 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
我用这个方法。
public static Integer getQuarter(Date d){
Calendar c = Calendar.getInstance();
c.setTime(d);
int month = c.get(Calendar.MONTH);
return (month /3)+1;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.