Java 获取上一季度的日期

Java 获取上一季度的日期,java,date,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

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

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;
但是我怎样才能知道最后一个季度的最后日期呢?i、 e 2017-06-30,这是最后一个季度的最后一个日期。

您应该使用JDK 8的java.time API并尝试该项目,以获得预期的结果,因为它在很大程度上简化了这些场景。 我想您需要使用just date,因此您可以按如下方式获取当前日期:

ZoneId zone = ZoneId.systemDefault();
LocalDate today = LocalDate.now (zone);
YearQuarter lastQuarter = YearQuarter.now (zone).minusQuarters(1);
LocalDate lastDayOfLastQuarter = lastQuarter.atEndOfQuarter ();
然后,您可以利用项目的类来获得当前和最后一个季度,如下所示:

ZoneId zone = ZoneId.systemDefault();
LocalDate today = LocalDate.now (zone);
YearQuarter lastQuarter = YearQuarter.now (zone).minusQuarters(1);
LocalDate lastDayOfLastQuarter = lastQuarter.atEndOfQuarter ();
免责声明:我还没有测试代码,只是为了让您了解使用这些API可以轻松地完成日期时间计算


更新:这是对您的评论的回应,您正在使用JDK 7,我建议如果可能的话升级到JDK 8,以利用它附带的所有新特性。如果您不能做到这一点,您可以使用JDK 6和7的java.time的后端口。但在这种情况下,你们将无法利用Basil Bourque在其对本帖的评论中指出的Threen Ten额外项目的YearQuarter类。已经展示了仅使用Three-Ten Backport的操作方法。

如果您正在使用Java,请尝试使用此方法。这不需要任何额外的包,标准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());

您必须使用java.util.Date和java.util.Calendar吗?如果你能使用java.time.*你的代码会更好。@JonSkeet你能给出一些示例吗example@AlexMan请给出所需输出的示例。例如,您现在在当前季度得到3,在上一季度得到2。你认为现在和最后一个季度的日期是什么?在我看来,季度是由几个月表示的,所以你需要什么类型的日期。@AhmadAlsanie我想要最后一个季度的最后一天,即2017-06-30当我不知道你是否能够使用它时,我不会开始写代码——这就是为什么我问你是否可以使用java 8中的java.time.*的原因。这就是我通常想要写答案的地方。我使用的是JDK1.7Three-Ten-Extra不能用于Three-Ten Backport,只能用于java 8和更高版本中内置的java.time类。但是YearQuarter类对于那些使用Java当前版本的人来说是很好的,谢谢@Basil Bourque指出这一点。最初的答案是用JDK 8编写的,因此建议使用YearQuarter。我相信这是正确的,而且它不需要对Java 7做任何额外的修改,这当然是正确的。另一方面,它的代码要多得多,而且更复杂,更难阅读。我仍然建议您像其他答案一样考虑Three Ten Backport。在升级到Java 8或9之前,您只需要暂时使用它。最好使用现代的Java.time类,而不是这里显示的麻烦的旧遗留类。当然,我完全同意,@BasilBourque,但是如果OP有机会升级到Java8,那么gold也会关注这个用户吗?她的答案非常好。