繁体   English   中英

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

[英]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;

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

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

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

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

tl;博士

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

三十额外

abdmob答案是正确的:使用java.time是明智的选择。

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

其有用的类包括:

本季度

要获取当前季度,请指定时区。 确定一个季度意味着确定一个日期。 确定日期意味着指定时区。 对于任何给定时刻,日期因地区而异。 使用正确的时区名称continent/region形式指定。 切勿使用 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 );

生成YearQuarterZonedDateTime

YearQuarter yq = YearQuarter.from( zdt );

在整个代码中使用

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


关于java.time

java.time框架内置于 Java 8 及更高版本中。 这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar ,和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 的试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

确保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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM