亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

安全簡單日期格式解析

安全簡單日期格式解析

幕布斯6054654 2022-09-28 16:13:03
我有一小塊代碼,它從響應本身解析響應生成時間,并將其轉換為日期以供將來使用。它是這樣的:SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); Date responseTime = sdf.parse(RStime);它幾乎像一個魅力。確切地說,它的工作時間為99.9%,但有一種情況除外:當毫秒部分是000時,服務器根本不會附加.000毫秒,因此我們有一個問題。現在,根據簡單日期格式文檔,如果解析失敗,該函數將返回null。但是,我可能誤解了它,因為它只是拋出了一個異常。我對Java和試探機制非常陌生,所以任何人都可以為處理這種情況提供一個優雅的良好實踐解決方案嗎?謝謝!
查看完整描述

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.時間.


查看完整回答
反對 回復 2022-09-28
?
波斯汪

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

}


查看完整回答
反對 回復 2022-09-28
?
Helenr

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 起支持可選選項。


查看完整回答
反對 回復 2022-09-28
?
動漫人物

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;

}


查看完整回答
反對 回復 2022-09-28
  • 4 回答
  • 0 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號