本文介紹了2月29日的SimpleDateFormat分析日期錯誤的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我已經(jīng)連接好了
public static boolean isFirstDayOfMonth(String format, String value) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date date = null;
try {
date = sdf.parse(value);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
return dayOfMonth == 1;
}
測試并返回True:
boolean actual = CommonUtil.isFirstDayOfMonth("yyyy-MM-dd", "2021-02-29");
assertTrue(actual);
I Found Out SimpleDateFormat將日期轉換為2021年3月1日,盡管2021年沒有2月29日。如果我在2021-02-30中通過,這是無效的,但它返回正確的結果。
推薦答案
tl;dr
java.time.LocalDate.parse( "2021-02-29" )
…
catch ( DateTimeParseException e ) // Thrown for invalid inputs
java.time
您正在使用幾年前被JSR 310中定義的java.time類取代的可怕的日期-時間類。
默認情況下,java.time.LocalDate
類拒絕解析無效輸入。分析異常的陷阱。
try {
LocalDate ld = LocalDate.parse( "2021-02-29" ) ;
System.out.println( ld ) ;
} catch ( DateTimeParseException e ) {
// … handle invalid input
System.out.println( "Faulty input" ) ;
}
查看此code run live at IdeOne.com。
關于java.time
java.time框架內置于Java 8及更高版本中。這些類取代了麻煩的舊legacy日期-時間類,如java.util.Date
、Calendar
、&;SimpleDateFormat
。
要了解更多信息,請參閱Oracle Tutorial。和搜索堆棧溢出以獲取許多示例和解釋。規(guī)范為JSR 310。
Joda-Time項目現(xiàn)在位于maintenance mode中,建議遷移到java.time類。
您可以直接與數(shù)據(jù)庫交換java.time對象。使用符合JDBC 4.2或更高版本的JDBC driver。不需要字符串,也不需要java.sql.*
類。Hibernate 5&;JPA 2.2支持java.time。
從哪里獲取java.time類?
Java SE 8、Java SE 9、Java SE 10、Java SE 11以及更高版本–標準Java API的一部分,具有捆綁實現(xiàn)。
Java 9帶來了一些次要功能和修復。
Java SE 6和Java SE 7
大部分java.time功能已后移植到ThreeTen-Backport中的Java 6&;7。
Android
更高版本的Android(26+)捆綁了java.time類的實現(xiàn)。
對于更早的Android(<;26),API desugaring的進程帶來了Android最初沒有內置的subset of the java.time功能。
如果去糖化不能滿足您的需求,ThreeTenABP工程會將ThreeTen-Backport(上面提到的)適配到Android。請參見How to use ThreeTenABP…。
這篇關于2月29日的SimpleDateFormat分析日期錯誤的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,