如何使用java获取上一季度的详细信息

时间:2017-07-10 15:48:41

标签: java date calendar

我已经达到了如上所示的上一季度:

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;

我有lastQuarter,但我将如何获得最后一个季度。

有人可以帮我吗?

4 个答案:

答案 0 :(得分:5)

您也可以使用自己的条件,

year = (presentQuarter - 1) > 0 ? year:year-1;

答案 1 :(得分:3)

您需要有一个单独的变量来存储季度计算。我会尝试类似以下内容。

int calculatedLastQuarter = presentQuarter - 1;
int lastQuarterYear = (calculatedLastQuater < 0) ? year-1 : year;
int lastQuarter = (presentQuarter < 0) ? 4 : calculatedLastQuater;

答案 2 :(得分:2)

TL;博士

  

我将如何获得最后一个季度。

YearQuarter.now( ZoneId.of( "Africa/Casablanca" ) ) 
           .minusQuarters( 1 )
           .getYear()
  

2017

YearQuarter

ThreeTen-Extra项目为Java 8及更高版本中内置的java.time类添加了功能。

项目的课程包括QuarterYearQuarter。这些季度基于ISO 8601日历,运行1月至3月等等。

获取当前季度。

YearQuarter yq = YearQuarter.now( ZoneId.of( "Pacific/Auckland" ) ) ;

致电minusQuarters进行数学运算。

YearQuarter yqPrevious = yq.minusQuarters( 1 ) ;

如果需要,您可以提取年份和季度数字。最好在代码库周围传递这些YearQuarter对象,而不是仅仅使用整数,以获得类型安全性并忍受有效值。

int year = yqPrevious.getYear() ;
int q = yqPrevious.getQuarterValue() ;

要序列化为字符串,请调用toString以符合ISO 8601格式样式的格式生成字符串:yyyy-Qq(尽管该标准实际上并不涉及季度)。

String output = yq.toString() ;

...并解析......

YearQuarter yq = YearQuarter.parse( "2017-Q1" ) ;

答案 3 :(得分:1)

虽然您可以自己进行数学计算(正如其他答案已经涵盖的那样),但您可以考虑使用新的日期/时间API。

如果您使用 Java 8 ,请考虑使用new java.time API。它更容易,less bugged and less error-prone than the old APIs

如果您正在使用 Java&lt; = 7 ,则可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。对于 Android ThreeTenABP(更多关于如何使用它here)。

以下代码适用于两者。 唯一的区别是包名称(在Java 8中为java.time而在ThreeTen Backport(或Android的ThreeTenABP中)为org.threeten.bp),但类和方法名称是一样的。

代码很简单:

// current date
LocalDate now = LocalDate.now();

// get quarter
int presentQuarter = now.get(IsoFields.QUARTER_OF_YEAR);

// year for last quarter
int year = now.minus(1, IsoFields.QUARTER_YEARS).getYear();

LocalDate位于java.timeorg.threeten.bp个包中,IsoFields位于java.time.temporalorg.threeten.bp.temporal中(取决于您是否&#39;重新使用Java 8或ThreeTen Backport)。

我使用LocalDate.now(),使用系统的默认时区获取当前日期,但最好总是明确指出您使用的时区(即使你使用默认值):

// use system default timezone
LocalDate now = LocalDate.now(ZoneId.systemDefault());

但系统的默认时区可以更改(即使在运行时),因此通过名称显式更改时更好:

// current date using an explicit timezone name
LocalDate now = LocalDate.now(ZoneId.of("Europe/London"));

API使用IANA timezones names(始终采用Continent/City格式,如America/Sao_PauloEurope/Berlin。 避免使用3个字母的缩写(例如CSTPST),因为它们是ambiguous and not standard

您可以致电ZoneId.getAvailableZoneIds()获取可用时区列表(并选择最适合您系统的时区)。