2015-12-20 377 views
-2

我正在解析從用戶查詢接收到的日期和來自XML文件的另一個日期。 當我想要得到公正年,其打印1,而不是一年,通過使用:Calender.YEAR不能打印正確的值

calender.YEAR 

這是代碼:

Elements date = doc.getElementsByTag("DATE"); 

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
Date inputDate = dateFormat.parse(obj.tryParse(dateFrom)); 
Date xmlDate = dateFormat.parse(obj.tryParse(date.get(0).text())); 

Calendar calInput = Calendar.getInstance(); 
Calendar calXml = Calendar.getInstance(); 

calInput.setTime(inputDate); 
calXml.setTime(xmlDate); 

System.out.println(calInput.YEAR +" "+ calXml.YEAR +" = "+calInput.getTime().toString()+"|||"+ calXml.getTime().toString()); 
if(calInput.YEAR != calXml.YEAR) 
    continue; 

這是輸出的一個樣本:

Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Sun Feb 01 00:00:00 IST 2004 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002 
Info: 1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002 
+0

@YassinHajaj,它應該打印2003年和2004年等! 爲什麼打印1 1!? –

+1

因爲你正在打印一個值爲1的常數。 – Andreas

回答

2

calXml.YEAR應寫入Calendar.YEAR,因爲它是被使用作爲參數來像01的方法常數(public static final)值和add(int field, int amount)。請致電calXml.get(Calendar.YEAR)

+0

Thaaaaaaanx man :) –

+1

由於Java的怪異性,請注意MONTH'值是0-11而不是1-12。 – Andreas

+0

是的,我知道 –

0

Andreas的Answer是正確的。

java.time

或者,你可以使用新的java.time框架構建在Java 8和更高版本。舊的日期 - 時間類是一團糟,應該避免。

從java.util.Date轉換爲java.time.Instant。 Instant是UTC時間軸上的一個時刻。

Instant instant = yourJavaUtilDate.toInstant(); 

應用時區。您的問題代碼隱含地取決於JVM當前的默認時區。我建議最好明確指定你想要的/預期的時區。時區對確定日期和年份至關重要。

ZoneId zoneId = ZoneId.of("Asia/Kolkata"); 
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant , zoneId); 

現在我們可以提取年份數。

int year = zdt.getYear(); 

或者更有趣,我們可以得到一個Year對象。

Year year = Year.from(zdt); 
Boolean isLeapYear = year.isLeap(); 
int yearNumber = year.getValue();