我可以从以下代码中获取最后一个季度值:
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int presentQuarter = (month / 3) + 1;
int lastQuarter = (presentQuarter - 1) > 0 ? presentQuarter - 1 : 4;
但我如何才能获得上一季度的最后日期? (即2017-06-30
,这是上一季度的最后一次日期。)
答案 0 :(得分:3)
您应该使用JDK 8的java.time
API并尝试ThreeTen-Extra项目,以获得所需的结果,因为它在很大程度上简化了这些方案。
我想你需要使用日期,所以你可以得到如下的当前日期:
ZoneId zone = ZoneId.systemDefault();
LocalDate today = LocalDate.now (zone);
然后,您可以利用YearQuarter
项目的ThreeTen-Extra类获取当前和上一季度,如下所示:
YearQuarter lastQuarter = YearQuarter.now (zone).minusQuarters(1);
LocalDate lastDayOfLastQuarter = lastQuarter.atEndOfQuarter ();
免责声明:我没有对代码进行测试,只是为了让您轻松了解使用这些API进行日期时间计算的方法。
更新:这是对您使用JDK 7的评论的回应,我建议尽可能升级到JDK 8,以利用它附带的所有新功能。如果您无法做到这一点,您可以使用java.time
的后端口用于JDK 6和7,ThreeTen-Backport。但在这种情况下,你将无法利用Basil Bourque在对这篇文章的评论中指出的ThreeTen-Extra项目的YearQuarter
类。 Hugo's answer已经显示了仅使用ThreeTen-Backport的方法。
答案 1 :(得分:2)
如果您正在使用 Java< = 7 ,则可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。对于 Android ,ThreeTenABP(更多关于如何使用它here)。
所有相关课程都在org.threeten.bp
包中。
由于您似乎只关心日期(日/月/年),我使用的是org.threeten.bp.LocalDate
课程。我还使用org.threeten.bp.temporal.IsoFields
类,其中包含可以正确处理季度的字段:
// get today's date
LocalDate today = LocalDate.now();
// get previous quarter
LocalDate previousQuarter = today.minus(1, IsoFields.QUARTER_YEARS);
// get last day in previous quarter
long lastDayOfQuarter = IsoFields.DAY_OF_QUARTER.rangeRefinedBy(previousQuarter).getMaximum();
// get the date corresponding to the last day of quarter
LocalDate lastDayInPreviousQuarter = previousQuarter.with(IsoFields.DAY_OF_QUARTER, lastDayOfQuarter);
lastDayInPreviousQuarter
将是2017-06-30
。
上面的代码在您系统的默认时区中获取当前日期,但如果您想要更可靠的代码,您可以使用org.threeten.bp.ZoneId
类告诉API明确使用一个特定时区。在此示例中,我使用了我的(America/Sao_Paulo
),但您可以更改为最适合您系统的那个:
// get today's date in a specific timezone
ZoneId zone = ZoneId.of("America/Sao_Paulo");
LocalDate today = LocalDate.now(zone);
API使用IANA timezones names(始终采用Region/City
格式,如America/Sao_Paulo
或Europe/Berlin
。
避免使用3个字母的缩写(例如CST
或PST
),因为它们是ambiguous and not standard。
您可以致电ZoneId.getAvailableZoneIds()
获取可用时区列表(并选择最适合您系统的时区)。
首选使用显式时区,因为即使在运行时,也可以在不事先通知的情况下更改系统的默认值。
如果您还需要其他字段(例如小时,分钟,秒等),请选中解释所有新类型的this tutorial。本教程适用于Java 8,但是ThreeTen Backport有所有相同的类和方法(只是包名不同:在Java 8中是java.time
而在ThreeTen Backport中是{{1 }})。
答案 2 :(得分:0)
试试这个。除了标准jdk包中的那些包之外,这不应该需要任何额外的包。
Date date = new Date();
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int presentQuarter = (month / 3) + 1;
int lastQuarter = 0;
if(presentQuarter - 1 > 0){
lastQuarter = presentQuarter - 1;
}else{
lastQuarter = 4;
year--;
}
month = lastQuarter * 3 - 1;
cal.set(year, month, 1);
int day = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
cal.set(year, month, day);
System.out.println(cal.getTime());