4 回答

TA貢獻1155條經驗 獲得超0個贊
時間
String rsTime = "2018-04-09T10:47:16.999-02:00";
OffsetDateTime responseTime = OffsetDateTime.parse(rsTime);
System.out.println("Parsed date and time: " + responseTime);
此代碼段的輸出為:
解析日期和時間: 2018-04-09T10:47:16.999-02:00
它也適用于省略了000毫秒的版本:
String rsTime = "2018-04-09T10:47:16-02:00";
解析時間: 2018-04-09T10:47:16-02:00
您使用的類 和 ,設計得很差,而且已經過時了(前者尤其麻煩)。因此,我不僅在這種情況下建議使用java.time,即現代Java日期和時間API。但是,來自服務器的字符串采用ISO 8601格式,并且其他類java.time將此格式解析為其默認格式,即沒有任何顯式格式化程序,這已經使任務變得非常容易。此外,在標準中,秒的小數部分是可選的,這就是為什么字符串的兩個變體都被解析而沒有任何問題的原因。 還會從它的方法打印回ISO 8601,這就是為什么在這兩種情況下都會打印與解析的字符串相同的字符串。SimpleDateFormatDateOffsetDateTimeOffsetDateTimetoString
只有在您不可避免地需要一個老式對象來制作您現在無法更改的舊版API時,請像這樣轉換:Date
Instant responseInstant = responseTime.toInstant();
Date oldfashionedDateObject = Date.from(responseInstant);
System.out.println("Converted to old-fashioned Date: " + oldfashionedDateObject);
我在歐洲/哥本哈根時區的計算機上的輸出是:
轉換為老式日期: 星期一 Apr 09 14:47:16 CEST 2018
鏈接: 甲骨文教程: 日期時間解釋如何使用 java.時間.

TA貢獻1811條經驗 獲得超4個贊
根據您提到的簡單日期格式文檔,該方法:parse
public Date parse(String text, ParsePosition pos)
拋出:
空點異常 - 如果文本或 pos 為空。
因此,一種選擇是捕獲該異常并在捕獲中執行所需的操作,例如:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
try {
Date responseTime = sdf.parse(RStime, position);
} catch (NullPointerException e) {
e.printStackTrace();
//... Do extra stuff if needed
}
或者從日期格式繼承的方法:
public Date parse(String source)
拋出:
解析異常 - 如果無法解析指定字符串的開頭。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
try {
Date responseTime = sdf.parse(RStime);
} catch (ParseException e) {
e.printStackTrace();
//... Do extra stuff if needed
}

TA貢獻1780條經驗 獲得超4個贊
您可以檢查點,然后使用第一種或第二種格式:
String timeString = "2018-04-09T10:47:16.999-02:00";
//String timeString = "2018-04-09T10:47:16-02:00";
String format = timeString.contains(".") ? "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" : "yyyy-MM-dd'T'HH:mm:ssXXX";
Date responseTime = new SimpleDateFormat(format).parse(timeString);
System.out.println("responseTime: " + responseTime);
如果您注釋掉第一行,注釋第二行并再次運行它,它將打印出來:
responseTime: Mon Apr 09 14:47:16 CEST 2018
順便一提:
Java 7(您顯然使用的版本)返回一個java.text.ParseException: Unparseable date: "2018-04-09T10:47:16-02:00"
自 Java 8 起支持可選選項。

TA貢獻1815條經驗 獲得超10個贊
這真的是一個特殊情況嗎?如果不是,那么在這種情況下,您可能不應該使用異常。在我看來,時間以.000ms結束是正常的。在這種情況下,您可以檢查字符串是否包含(點),如果沒有,則將.000附加到末尾。.
if(!RStime.contains(".")){
RStime+=".000";
}
編輯:我忘記了時間字符串中的時區。為此,您可能需要一些更復雜的東西。像這樣的事情應該這樣做:
if(!RStime.contains(".")){
String firstPart = RStime.substring(0, 21);
String secondPart = RStime.substring(21);
RStime = firstPart + ".000" + secondPart;
}
添加回答
舉報