[英]Java - GregorianCalendar
我正在Java中使用GregorianCalendar
,我想知道如何使用它來檢查日期是否有效(例如:檢查2月29日是否僅在leap年中,檢查日期是否不早於當前數據等)。
我創建了一個GregorianCalendar對象,並將其要傳遞的數據值傳遞給它,如下所示:
GregorianCalendar cal1 = new GregorianCalendar(day,month,year);
如果日期有效,我想返回true。 我該怎么辦?
基本思想:如果您嘗試將無效日期設置為Calendar實例,它將使其正確,
例如,如果您將45設置為日期,則設置和檢索后就不會相同
public boolean isValid(int d, int m, int y){
//since month is 0 based
m--;
//initilizes the calendar instance, by default the current date
Calendar cal = Calendar.getInstance();
//resetting the date to the one passed
cal.set(Calendar.YEAR, y);
cal.set(Calendar.MONTH, m);
cal.set(Calendar.DATE, d);
//now check if it is the same as we set then its valid, not otherwise
if(cal.get(Calendar.DATE)==d &&cal.get(Calendar.MONTH) ==m && cal.get(Calendar.YEAR) ==y){
return true;
}
//changed so not valid
return false;
}
創建后,請檢查日期,月份和年份是否仍與您傳遞的原始值相同。 如果原始值不正確,則日期將相應調整。 例如。 如果通過(2011年1月29日),請注意,月份值是從0開始的,所以1月是2月-,您將得到(2011年1月3日)。
java.time.LocalDate.of( 2018 , 2 , 31 )
➙捕獲DateTimeException
以獲取無效的月份編號。
ZonedDateTime
類已將GregorianCalendar
類替換為Java 8及更高版本中內置的java.time的一部分。 新方法已添加到舊類中以進行轉換。
ZonedDateTime zdt = myGregCal.toZonedDateTime() ;
您只需要一個日期值,因此請使用LocalDate
,而不要設置日期和時區。
您可以從ZonedDateTime
時間提取LocalDate
。
LocalDate ld = zdt.toLocalDate() ;
您可以用數字設置月份,一月至十二月的理智編號為1-12。
LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ; // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
或者,最好使用預定義的Month
枚舉對象,一年中的每個月使用一個。 提示:在整個代碼庫中使用這些Month
對象,而不是僅使用整數,可以使您的代碼更具自文檔性,確保有效值並提供類型安全 。
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
檢查2月29日是否僅在leap年
`LocalDate.of(year,month,day)的文檔說:
該日期必須對年和月有效,否則將引發異常。
因此趕上DateTimeException
。
try {
LocalDate ld = LocalDate.of( 2018 , 2 , 31 ) ; // Invalid, February never has 31 days.
return Boolean.TRUE ;
} catch ( DateTimeException e ) {
return Boolean.FALSE ;
}
是的, LocalDate
支票閏年處理2月29日正常。
try {
LocalDate ld = LocalDate.of( 2018 , 2 , 29 ) ; // Invalid, as 2018 is a common year.
return Boolean.TRUE ;
} catch ( DateTimeException e ) {
return Boolean.FALSE ;
}
假
…
LocalDate ld = LocalDate.of( 2020 , 2 , 29 ) ; // Valid, as 2020 is a leap year.
…
真正
檢查日期是否早於當前數據
我認為您的意思是“當前日期”。
時區對於確定日期至關重要。 在任何給定時刻,日期都會在全球范圍內變化。 例如, 法國巴黎午夜過后幾分鍾是新的一天,而在魁北克蒙特利爾仍然是“昨天”。
如果未指定時區,則JVM隱式應用其當前的默認時區。 該默認值可能隨時更改,因此您的結果可能會有所不同。 最好將您的期望/期望時區明確指定為參數。
以continent/region
的格式指定正確的時區名稱 ,例如America/Montreal
, Africa/Casablanca
或Pacific/Auckland
。 切勿使用EST
或IST
等3-4個字母的縮寫,因為它們不是真實的時區,不是標准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
與isBefore
, isAfter
和isEqual
。
boolean b = ld.isBefore( today ) ;
java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time類。
要了解更多信息,請參見Oracle教程 。 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310 。
使用兼容JDBC 4.2或更高版本的JDBC驅動程序 ,您可以直接與數據庫交換java.time對象。 不需要字符串或java.sql。*類。
在哪里獲取java.time類?
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.