Java 查找会计年度特定日期所属的季度
我正在使用Java1.7,如何找到一个会计年度中某个特定日期所属的季度,该季度可以从1月1日到12月1日开始,还需要该季度的开始日期和结束日期 i、 e假设2017年4月1日至2018年3月31日,2017年6月26日属于第1季度,季度开始日期为2017年10月1日,结束日期为2017年12月31日。等使用日历:Java 查找会计年度特定日期所属的季度,java,Java,我正在使用Java1.7,如何找到一个会计年度中某个特定日期所属的季度,该季度可以从1月1日到12月1日开始,还需要该季度的开始日期和结束日期 i、 e假设2017年4月1日至2018年3月31日,2017年6月26日属于第1季度,季度开始日期为2017年10月1日,结束日期为2017年12月31日。等使用日历: Calendar cal = Calendar.getInstance(); cal.setTime(myDate); 季度: int q = cal.get(Calendar.MO
Calendar cal = Calendar.getInstance();
cal.setTime(myDate);
季度:
int q = cal.get(Calendar.MONTH)%3;
System.out.println("Quarter: Q" + (q + 1));
季度初:
cal.set(Calendar.MONTH, 3*q);
cal.set(Calendar.DAY_OF_MONTH, 1);
Date start = cal.getTime();
System.out.println("Start: " + start);
cal.add(Calendar.MONTH, 3);
cal.add(Calendar.DATE, -1);
Date end = cal.getTime();
System.out.println("End: " + end);
季度末:
cal.set(Calendar.MONTH, 3*q);
cal.set(Calendar.DAY_OF_MONTH, 1);
Date start = cal.getTime();
System.out.println("Start: " + start);
cal.add(Calendar.MONTH, 3);
cal.add(Calendar.DATE, -1);
Date end = cal.getTime();
System.out.println("End: " + end);
在Java 7中,您可以执行以下操作:
public static void main(String[] args) {
// Dates are DD/MM/YYYY
String date_string = "26/06/2017";
String quarter_start_string = "01/04/2017";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date in_date = sdf.parse(date_string);
Date qstart = sdf.parse(quarter_start_string);
boolean found = false;
int quarter = 1;
Calendar in_date_cal = GregorianCalendar.getInstance();
in_date_cal.setTime(in_date);
Calendar fq_start = GregorianCalendar.getInstance();
fq_start.setTime(qstart);
Calendar fq_end = GregorianCalendar.getInstance();
fq_end.setTime(qstart);
fq_end.add(GregorianCalendar.MONTH, 3 );
while (!found) {
if (in_date_cal.hashCode() >= fq_start.hashCode() &&
in_date_cal.hashCode() <= fq_end.hashCode()) {
break;
}
fq_start.add(GregorianCalendar.MONTH, 3 );
fq_end.add(GregorianCalendar.MONTH, 3 );
quarter++;
}
System.out.println("Quarter# is " + quarter);
System.out.println("Quarter Start is " + sdf.format(fq_start.getTime()));
System.out.println("Quarter End is " + sdf.format(fq_end.getTime()));
}
java.time
现代java数据和时间API java.time为您提供了所需的大部分内容。只是它死了,不知道你的财政年度。您请求的季度比java.time支持的ISO日历系统中使用的季度少一个季度。所以我的技巧是从日期中减去一个季度,然后查询java.time关于季度和年份的信息。这将为您提供所需的数字
在代码中,尝试不同的日期:
LocalDate[] exampleDates = {
LocalDate.of(2020, Month.JANUARY, 1),
LocalDate.of(2020, Month.JUNE, 30),
LocalDate.of(2020, Month.AUGUST, 22),
LocalDate.of(2020, Month.OCTOBER, 1),
LocalDate.of(2021, Month.MARCH, 31),
};
for (LocalDate date : exampleDates) {
LocalDate syntheticQuarterDate = date.minus(1, IsoFields.QUARTER_YEARS);
// Get quarter number and year as int
int quarter = syntheticQuarterDate.get(IsoFields.QUARTER_OF_YEAR);
int year = syntheticQuarterDate.getYear();
System.out.format("Quarter: %d; year: %d%n", quarter, year);
}
输出为:
假设您想要一个类似Q412019的字符串,而不是数字。在这种情况下,最好使用格式化程序:
DateTimeFormatter quarterFormatter
= DateTimeFormatter.ofPattern("QQQuuuu", Locale.ENGLISH);
现在,对于每个日期,请执行以下操作:
// Print a string like "Q42019"
String quarterString = syntheticQuarterDate.format(quarterFormatter);
System.out.println(quarterString);
使用与之前相同的日期进行输出:
问题:这对Java7有效吗?
time在Java7上运行良好。它至少需要Java6
在Java8和更高版本以及API级别为26的较新Android设备上,内置了现代API。
在非Android Java 6和7中,获得了Three Ten Backport,即JSR 310的现代类Three Ten的Backport;请参阅底部的链接。
在较旧的Android上,可以使用desugaring或Android版本的ThreeTen Backport。它叫ThreeTenABP。在后一种情况下,请确保使用子包从org.threeten.bp导入日期和时间类。
链接
解释如何使用java.time。
,其中首次描述了java.time。
,java.time的后端口到JSR-310的Java6和Java7。
,Android版Three Ten Backport
,解释得非常透彻。
我的回答也是在
将月份M与日期分开;如果M小于F/Y的起始月,则M加12;从M中减去F/Y起始月,得到FY MFY的月份;将MFY除以4,然后在商中加1以获得季度Q。感谢您的解决方案,但除了季度之外,我们还需要该特定季度的开始和结束日期。提示:搜索“半开放”和YearMonth。这已经在Stack Overflow上讨论过很多次了。因此,如果财政年度不是4月1日,只需将第一次提到的神奇数字3更改为另一个数字,而不是将另外两次提到的数字更改为另一个数字?理想情况下,这应该是一个方法参数。无幻数3是一个季度3个月的长度。如果财政年度没有从4月1日开始,只需更改季度开始字符串。啊,是的,我错过了那个。不过你的观点很好理解-3应该是季度月份或类似的。这些麻烦的旧遗留日期时间类被java 8及更高版本中的java.time类所取代。@BasilBourque如果你不喜欢Calendar类,写你自己的回答Maurice Perry,我认为
Q42019
Q12020
Q22020
Q32020
Q42020