2014-02-28 172 views
1

我遇到Calendar類問題。日曆類問題

Calendar cal = Calendar.getInstance(); 

int iYear = cal.get (Calendar.YEAR);   // get the current year 

int iMonth = cal.get (Calendar.MONTH);  // month... 

int iDay = cal.get (Calendar.); // current day in the month 

這...沒有工作! :-(

我使用的調試,發現年和DAY_OF_MONTH是正確的,但是 的月份是1(1月),當它應該是2(2月)。

這是它得到更WEIRD:

我又試圖其次cal.set (2014, 2, 27); // Today's Date - Feb 27, 2014

cal.clear();

,月還是1(即一月)

我將在一月份的日期天(2014年1,1),(2014,1,16)等 它正確地給了我一個月

1閱讀和嘗試很多事情後(並把我的頭髮拉出來..) 我把它設定在未來的日期,我的生日(2014,5,23)和其他日子。 對於那些日期,月份被正確設置到5(5月)

+0

Thanx @Solution 我最終試圖比較DateX之前或之後的當前日期。 當前日期是通過getInstance設置一個基於ZERO的系統。 我使用 - > .set(2014,2,27)設置DateX一個基於系統思考2代表Feb在「正常」日曆 當我比較兩個日期時,我不知不覺地使用了兩個不同的編號系統。 道德 - >如果可能,使用常量.set(2014,Calendar.FEBRUARY,28) 它使代碼更具可讀性,即FEBRUARY而不是1,因爲#1似乎是1月份,所以沒有意義。 – user3239782

回答

0
In Calender class Jan as constant int is 0 , Feb is 1 ... .month constant int value is from 0,1,2.. 
1

本月Calendar從0開始,這意味着0是一月,1是二月等等

Java的日期和時間API吸。改爲使用Joda-Time。在Calendar

+0

FYI, [Joda-Time](http://www.joda.org/joda-time/)項目現在處於[維護模式](https://en.wikipedia.org/wiki/Maintenance_mode),團隊建議遷移到[java.time](http://docs.oracle.com/javase/9​​/docs/api/java/time/package-summary.html)類。請參見[Oracle教程](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)。 –

1

使用常數月:Calendar.JANUARY

例如:

cal.set(2014, Calendar.FEBRUARY, 27); 
0

讓我們試試這個簡單的程序:

import java.util.Calendar; 
class CalendarExample { 
public static void main(String args[]) { 

Calendar calendar = Calendar.getInstance(); 
System.out.println("Current Date : " + calendar.get(Calendar.DATE)); 
System.out.println("Current Month : " + calendar.get(Calendar.MONTH)); 
System.out.println("Current Year : " + calendar.get(Calendar.YEAR)); 
System.out.print("Current Time : "); 
System.out.print(calendar.get(Calendar.HOUR) + ":"); 
System.out.print(calendar.get(Calendar.MINUTE) + ":"); 
System.out.print(calendar.get(Calendar.SECOND)); 
} 
} 

你得到的O/P:

Current Date : 28 
Current Month : 1 
Current Year : 2014 
Current Time : 11:18:3 
1

請參閱爲日曆類中的MONTH常量提供的說明。

Calendar.MONTH 

公共靜態最終詮釋MONTH

場的獲取與指示一個月定數。這是一個日曆特定的值。格里高利和朱利安曆法中的第一個月是JANUARY,它是0;最後一個取決於一年中的月數。

所以如果你想在日曆中設置日期比使用下面的代碼片段。

cal.set(2014, Calendar.FEBRUARY, 28); 

我認爲它會幫助你。

0

TL;博士

LocalDate.now() 
     .getYear() 

java.time

現代的方法採用了業界領先的java.time類。

LocalDate

LocalDate類表示沒有時間一天和不同時區的日期,唯一的價值。

時區對確定日期至關重要。對於任何特定的時刻,日期因地區而異。例如,Paris France午夜後幾分鐘是新的一天,而在Montréal Québec仍然是「昨天」。

如果未指定時區,則JVM將隱式應用其當前默認時區。該默認值可能隨時改變,因此您的結果可能會有所不同。最好明確指定所需的/預期的時區作爲參數。

continent/region的格式指定一個proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4字母縮寫,如ESTIST,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of("America/Montreal") ; 
LocalDate today = LocalDate.now(z) ; 

如果要使用JVM的當前默認時區,請求它並作爲參數傳遞。如果省略,則隱式應用JVM的當前默認值。最好是明確的。

ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone. 

或指定一個日期。你可以用一個數字來設定月份,一月份到十二月份的數字爲1-12。

LocalDate ld = LocalDate.of(1986 , 2 , 23) ; // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December. 

或者,更好,使用Month枚舉對象預先定義的,一個是一年中每個月。提示:在整個代碼庫中使用這些Month對象而不是一個整數,以使代碼更加自我記錄,確保有效值,並提供type-safety

LocalDate ld = LocalDate.of(1986 , Month.FEBRUARY , 23) ; 

零件

詢問爲根據需要的部件。

int dayOfMonth = ld.getDayOfMonth() ; 
int month = ld.getMonthValue() ; 
int year = ld.getYear() ; 

關於java.time

java.time框架是建立在Java 8和更高版本。這些類代替了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore