获取上一季度的日期日期

时间:2017-07-21 11:07:25

标签: java date

我可以从以下代码中获取最后一个季度值:

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,这是上一季度的最后一次日期。)

3 个答案:

答案 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_PauloEurope/Berlin。 避免使用3个字母的缩写(例如CSTPST),因为它们是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());