![](/img/trans.png)
[英]How to get the first date and last date of current quarter in java.util.Date
[英]How to get last quarter details using java
我已經取得了上一季度的成績,如下所示:
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
,但我將如何獲得最后一個季度的年份。
誰能幫我解決這個問題?
你也可以使用你自己的條件,
year = (presentQuarter - 1) > 0 ? year:year-1;
您需要有一個單獨的變量來存儲您的季度計算。 我會嘗試以下內容。
int calculatedLastQuarter = presentQuarter - 1;
int lastQuarterYear = (calculatedLastQuater < 0) ? year-1 : year;
int lastQuarter = (presentQuarter < 0) ? 4 : calculatedLastQuater;
我將如何獲得最后一個季度的年份。
YearQuarter.now( ZoneId.of( "Africa/Casablanca" ) )
.minusQuarters( 1 )
.getYear()
2017年
YearQuarter
ThreeTen-Extra項目為 Java 8 及更高版本中內置的 java.time 類添加了功能。
該項目的課程包括Quarter
和YearQuarter
。 這些季度基於 ISO 8601 日歷,運行 1 月至 3 月等。
獲取當前季度。
YearQuarter yq = YearQuarter.now( ZoneId.of( "Pacific/Auckland" ) ) ;
調用minusQuarters
進行數學計算。
YearQuarter yqPrevious = yq.minusQuarters( 1 ) ;
如果需要,您可以提取年份和季度數字。 最好將這些 YearQuarter 對象傳遞給您的代碼庫,而不是僅使用 int,以獲得類型安全並承受有效值。
int year = yqPrevious.getYear() ;
int q = yqPrevious.getQuarterValue() ;
要序列化為字符串,請調用toString
以遵循 ISO 8601 格式的格式生成字符串:yyyy-Qq(盡管該標准實際上並不涉及季度)。
String output = yq.toString() ;
…和解析…
YearQuarter yq = YearQuarter.parse( "2017-Q1" ) ;
雖然您可以自己計算(因為其他答案已經涵蓋),但您可以考慮使用新的日期/時間 API。
如果您使用的是Java 8 ,請考慮使用新的 java.time API 。 與舊 API 相比,它更容易、錯誤更少且更不容易出錯。
如果您使用的是Java <= 7 ,則可以使用ThreeTen Backport ,這是 Java 8 的新日期/時間類的一個很好的反向端口。 對於Android ,有ThreeTenABP (更多關於如何使用它的信息)。
下面的代碼適用於兩者。 唯一的區別是包名稱(在 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.time
或org.threeten.bp
包中, IsoFields
在java.time.temporal
或org.threeten.bp.temporal
中(取決於您使用的是 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 時區名稱(始終采用Continent/City
格式,例如America/Sao_Paulo
或Europe/Berlin
)。 避免使用 3 個字母的縮寫(如CST
或PST
),因為它們不明確且不標准。
您可以通過調用ZoneId.getAvailableZoneIds()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.