簡體   English   中英

盡管格式化模式中為“ yyyy”,但SimpleDateFormat無法拒絕輸入年份缺少的世紀輸入

[英]SimpleDateFormat fails to reject input missing century on the year of the input, despite “yyyy” in the formatting pattern

我有一個模式為yyyy-Md"的SimpleDateFormat,並且具有以下情形:

String str = "02-03-04";        
SimpleDateFormat f = new SimpleDateFormat("yyyy-M-d");
f.setLenient(false);
System.out.println(f.parse(str));

輸出為Sat Mar 04 00:00:00 EST 2

我的目標是只捕獲格式為2004-02-03的日期,而忽略02-03-04。 我認為格式中的yyyy需要4位數字的年份,但顯然不是這樣。 誰能解釋為什么這沒有引發解析異常? 我想要...

好吧,我可以從docs中解釋一下:

對於解析,如果模式字母的數量大於2,則將按字面意義解釋年份,而不考慮數字的數量。 因此,使用模式“ MM / dd / yyyy”,“ 01/11/12”將解析為公元12月11日

Joda Time可能會更嚴格-IMO總體而言是更好的API ...

如果解析后的年份少於1000年,您總是可以拋出異常。

tl; dr

如您所料,使用java.time時 ,使用該格式模式的輸入失敗。

LocalDate
.parse(
    "02-03-04" ,
    DateTimeFormatter.ofPattern ( "uuuu-M-d" )
)

…引發java.time.format.DateTimeParseException

java.time

現在,您所使用的類已由 JSR 310中定義並內置於Java 8及更高版本中的現代java.time類所取代。

LocalDate類表示僅包含日期的值,沒有日期, 時間段offset-from-UTC

根據要求定義自定義格式設置模式。 使用DateTimeFormatter類。

DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuu-M-d" );

嘗試解析您的輸入。

String input = "02-03-04";
LocalDate localDate = LocalDate.parse ( input , f );

我們遇到了DateTimeParseException ,在缺少輸入年份的世紀失敗。 如您所料。

線程“主”中的異常java.time.format.DateTimeParseException:無法在索引0處解析文本“ 02-03-04”


關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310

現在處於維護模式Joda-Time項目建議遷移到java.time類。

您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 不需要字符串,不需要java.sql.*類。

在哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM