我可以从下面的代码中获取最后一个季度的值:
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_Paulo
或Europe/Berlin
)。避免使用3个字母的缩写(例如
CST
或PST
),因为它们是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/