2017-06-03 108 views
-1

我想將我的字符串日期轉換爲整數,但我得到一個錯誤,例如我的日期'昏暗。 janv。 23 24:00:00 +0000 2011` 這是我的代碼部分:如何解決將字符串日期轉換爲整數時的錯誤?

String created_at = (String) jsonObject.get("created_at"); 
    System.out.println("la date de création de tweet est: " + created_at); 
    DateFormat df = new SimpleDateFormat(" ddd. MMMM. EE HH:mm:ss z yyyy"); 
    String s= df.format(created_at); 
    int out=Integer.valueOf(s); 
    System.out.println("new date " +out); 

,輸出是:

java.lang.IllegalArgumentException異常:無法格式化給定的對象作爲一個日期。

+0

'println'的輸出是什麼? – markspace

+0

將created_at的值與您的DateFormat進行比較,它會幫助您找到錯誤。 – Patrick

+0

關於第一個println我得到了「la date decréationdu tweet est:dim。janv。23 24:00:00 +0000 2011」,但是第二個println我只收到錯誤信息。 – celia

回答

2

那麼,你已經有字符串格式的日期,這就是format方法所做的。我假設你想要在這裏做的是parse日期(進入Date對象)而不是format

此外,它看起來像日期爲French語言環境,所以你需要使用沿着相應的語言環境與SimpleDateFormat和使用parse方法,例如:

DateFormat df = new SimpleDateFormat("EEE MMMM dd HH:mm:ss z yyyy", Locale.FRANCE); 
Date date = df.parse("dim. janv. 23 24:00:00 +0000 2011"); 
System.out.println(date); 

這將使你的Date對象。如果您想以不同的格式進行格式化,可以使用不同的格式調用format方法。

更新

此外,它看起來像你調用重載format方法(版本通過傳遞一個字符串,而不是一個Date對象。這evantually調用format方法TextFormat類(javadoc的here的),這就是爲什麼你認爲Exception

+0

謝謝,是的,它適用於我的第一個代碼,但對於其他它不工作知道日期的格式是「星期二08八月12:30:27 + 0000 2011」。 – celia

+0

如果日期字符串更改,則需要更改格式。 –

1

據我所知,有一個公認的答案了。我張貼這種激勵你和其他人放棄過時的類DateFormatSimpleDateFormat。這些在現代DateTimeFormatter和朋友們的日子裏,我們的日子變得更加美好,這些班級往往對程序員友善得多。所以儘可能使用這些 - 你可以。

System.out.println("la date de création de tweet est: " + created_at); 
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss xx uuuu", 
                 Locale.FRENCH); 
    OffsetDateTime dateTime = OffsetDateTime.parse(created_at, dtf); 

此打印:

la date de création de tweet est: dim. janv. 23 24:00:00 +0000 2011 
2011-01-24T00:00Z 

在法國的點是縮寫周和月的一天的一部分,所以他們不應該在格式模式字符串明確。另外請注意,你沒有領先的空間(除非你的日期時間字符串也有)。結果是正確的,因爲從1月23日的24小時午夜到24日的0小時是相同的。

評論「Tue Feb 08 12:30:27 +0000 2011」中的另一個字符串格式相同,只有英文。所以,你不必改變格式模式,只有區域:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss xx uuuu", 
                 Locale.ENGLISH); 

現在的結果是:

la date de création de tweet est: Tue Feb 08 12:30:27 +0000 2011 
2011-02-08T12:30:27Z 

我不明白有關轉換爲整數的部分。我注意到你在問題中的代碼中嘗試了Integer.valueOf(s),這隻有在你首先將日期時間格式化爲一串數字時纔有效。例如:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMdd"); 
    String s = dateTime.format(formatter); 
    int out = Integer.parseInt(s); 
    System.out.println("new date " + out); 

這將打印

new date 20110124 

但我可能在你的目標是什麼猜測不正確。如果你更好地解釋你的需求,我會很樂意編輯。我用parseInt()代替valueOf(),結果是一樣的,我只是避免了從Integerint的自動轉換。

編輯:如果推文的創建日期是例如「dim。janv。23 24:00:10 +0000 2011」?也就是說,午夜過了10秒。然後我們得到Invalid value for HourOfDay (valid values 0 - 23): 24

雖然Java明顯地接受24:00:00作爲時間,但它認爲午夜之後的時間應寫爲例如下一天的0:00:10。但是,我們可以很容易地放鬆這一要求:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss xx uuuu", 
                 Locale.FRENCH) 
      .withResolverStyle(ResolverStyle.LENIENT); 

日期時間格式化配有三個旋轉變壓器的風格,嚴謹,智能(默認)和寬鬆。使用最後一個我們得到

2011-01-24T00:00:10Z 

再次,符合市場預期,對24:00:10月23日的在24等於00:00:10。

+0

非常感謝你,但我仍然有一個錯誤我給你鏈接到我的問題https://stackoverflow.com/questions/44359402/how-to-solve-the-ervert-convert-string-date-from-xml -file到一個-INT的格式。 – celia

+0

我還有一個問題,例如當鳴叫的創建日期是「dim。janv。23 24:00:10 +0000 2011」時,它仍然是一個錯誤,runnig的輸出是:HourOfDay的無效值(有效值0 - 23):24.如何解決這個問題,謝謝。 – celia

+0

我看到問題,@celia。請參閱我的編輯。 –