2011-08-17 55 views
0

這是我的目標格式:字符串到日曆對象

2011年8月19日

我嘗試此字符串由下面的代碼到日曆對象轉換,但變量「日期」保持爲空。

SimpleDateFormat formatter ; 
     Date date = null ; 
     formatter = new SimpleDateFormat("dd MMM yyyy"); 
     try { 
     date = formatter.parse(returnDate); 
    } catch (ParseException e) {    
     e.printStackTrace(); 
    } 
     Calendar cal=Calendar.getInstance(); 
     cal.setTime(date); 

有誰知道發生了什麼問題?謝謝。

僅供參考,異常消息:

無法解析的日期: 「2011年8月19日」 在java.text.DateFormat.parse(未知 來源)

但我不認爲這是有用...

+0

無法重現,這是按預期對我工作 – dpsdce

+0

絕對*的例外*是有用的,並且在提問時應該*總是*。 「日期」仍然爲空的事實是次要的 - 這是您需要解決的例外情況。請參閱我的答案的底部以獲取建議的解決方案。 –

回答

7

解析出現問題。你並沒有因此而發現它:

catch (ParseException e) {    

} 

這基本上是說:「我不在乎什麼出了問題 - 忽略它。」在最少你應該記錄錯誤,並更有可能讓異常冒泡。

例外是一個令人難以置信的重要診斷工具 - 不要只是抓住他們,忽視他們。

編輯︰現在問題的變化,我們可以看到異常 - 但代碼仍然繼續,就好像什麼都沒有發生。即使你想要大多忽略異常,你需要決定什麼值你想要date如果解析失敗。顯然null是無益的 - 所以你需要讓異常冒泡(讓來電者知道解析失敗)返回一些差異值(例如默認日期,或今天,或類似的東西)。

現在,碰巧,讓異常冒泡使代碼更簡單。它不會在我的機器上拋出一個異常,但也許它會在你的:

import java.util.*; 
import java.text.*; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     Calendar cal = parseReturnDate("19 AUG 2011"); 
     System.out.println(cal); 
    } 

    public static Calendar parseReturnDate(String returnDate) 
     throws ParseException { 
     SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy"); 
     Date date = formatter.parse(returnDate); 
     Calendar cal=Calendar.getInstance(); 
     cal.setTime(date); 
     return cal; 
    }  
} 

注意,我們都不怎麼需要單獨聲明變量來分配他們的價值觀,而現在我們讓例外泡沫起來,我們可以直接指定date它的有用值。

我的猜測是您的默認時區不使用「AUG」作爲一個簡短的月份名稱 - 但我沒有看到異常,我真的不知道。如果是這樣的話,你可能要構建格式化時指定的區域設置:

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy", 
                Locale.US); 

威力還需要指定一個時區。

(順便說一下,Joda Time是一個非常優越的日期和時間處理API。如果你正在做與價值的任何顯著的工作之後,我肯定建議使用它在Date/Calendar。)

+0

此外,如果您想知道應該在該口頭詞中加入什麼,請嘗試「e.printStackTrace();」。 ;) – Vinay

+0

我知道錯誤 它是空指針異常,因爲解析失敗,日期保持爲空 我只是爲了簡單而刪除異常聲明,thx – Bear

+0

@Bear:所以你已經得到了你的答案 - 這是因爲解析失敗。你已經決定嘗試*忽略*解析失敗,那麼你期望*'date'有什麼價值?你爲什麼不專心解決解析失敗?對於我們來診斷解析失敗,你應該告訴我們拋出了什麼異常。 –

0

我只是想你的代碼,它工作正常。嘗試運行以下:

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 

public class Playground { 

    public static void main(String... args) { 

     String returnDate = "19 AUG 2011"; 
     SimpleDateFormat formatter ; 
     Date date = null ; 
     formatter = new SimpleDateFormat("dd MMM yyyy"); 

     try { 
      date = formatter.parse(returnDate); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     System.out.println(date.toString()); 

     Calendar cal = Calendar.getInstance(); 
     cal.setTime(date); 

     System.out.println(cal.getTime().toString()); 
    } 
} 

OUTPUT:

週五08月19日00:00:00 CAT 2011

週五08月19日00:00:00 CAT 2011

+0

@熊:你是說你已經*懷疑*問題可能與地區?如果是這樣,爲什麼不告訴*使用您的區域設置開始? –

+0

@熊,可能是啊。 –

+0

我不知道.... 我剛剛告訴尼科.... – Bear

1

默認情況下,SimpleDateFormat取決於當前日曆和區域設置上的日曆。 根據語言環境和日曆可能「AUG」不是該月份的有效文本。

AUG是適用於美國語言環境的有效字符串,但不適用於ES語言環境。

您可以強制的語言環境,以美國,它增加了SimpleDateFormat的:

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy",Locale.US); 

隨着在美國地區,如果日期有美國2月信你能正確解析字符串。