據我所知,有一個公認的答案了。我張貼這種激勵你和其他人放棄過時的類DateFormat
和SimpleDateFormat
。這些在現代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()
,結果是一樣的,我只是避免了從Integer
到int
的自動轉換。
編輯:如果推文的創建日期是例如「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。
'println'的輸出是什麼? – markspace
將created_at的值與您的DateFormat進行比較,它會幫助您找到錯誤。 – Patrick
關於第一個println我得到了「la date decréationdu tweet est:dim。janv。23 24:00:00 +0000 2011」,但是第二個println我只收到錯誤信息。 – celia