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

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

最佳答案

如果您使用的是Java 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为org.threeten.bp)。

关于java - 获取上一季度的日期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45236119/

10-11 16:12