簡體   English   中英

Java-GregorianCalendar

[英]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日)。

tl; dr

java.time.LocalDate.of( 2018 , 2 , 31 )

➙捕獲DateTimeException以獲取無效的月份編號。

java.time

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/MontrealAfrica/CasablancaPacific/Auckland 切勿使用ESTIST等3-4個字母的縮寫,因為它們不是真實的時區,不是標准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

isBeforeisAfterisEqual

boolean b = ld.isBefore( today ) ;

關於java.time

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

現在處於維護模式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中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

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

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