簡體   English   中英

您如何在Java中比較日期,上一個日期和將來的日期?

[英]How do you compare date, previous date and future date in Java?

在注冊一個人之前,我需要確認出生日期不大於先前的日期,例如(01/01/1970)和當前日期。

對我不起作用的方法:

 public void agregarPersona() throws Exception {
            ImplPersonaD dao;
            try {
            Date date = new Date();
            DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
            String fechaActual = String.valueOf(dateFormat.format(date));      
            String fechaPasada = "01/01/1970";
                if(fechaPasada  > persona.getFechNac() <= fechaActual ){
                dao = new ImplPersonaD();
                dao.agregarPersona(persona);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Satisfactorio", "Ingresado correctamente"));
              }
               else{
               FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Invalido", "Fecha invalida"));
                 }
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Hubo un problema"));
            }
        }

以下幾行無效,並且不執行您認為應做的事情:

String fechaActual= String.valueOf(Calendar.DATE/Calendar.MONTH/Calendar.YEAR);        
String fechaPasada = "01/01/1970";
if(fechaPasada  > persona.getFechNac() <= fechaActual ){

看來您想檢查persona.getFechNac()返回的值是1970年1月1日之后和當前日期之前或等於當前日期的日期。

正確的方法是這樣的:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

// ...

LocalDate fechaActual = LocalDate.now();
LocalDate fechaPasada = LocalDate.of(1970, 1, 1);

LocalDate fechNac = LocalDate.parse(persona.getFechNac(),
                            DateTimeFormatter.ofPattern("dd/MM/yyyy"));

if (fechNac.isAfter(fechaPasada) && fechaActual.isBefore(fechNac)) {
    // ...
}

我在這里假設persona.getFechNac()返回一個String其中包含格式為dd/MM/yyyy

TL;博士

使用現代類,尤其是LocalDate

LocalDate                                        // Represent a date-only value without a time-of-day and without a time zone or offset-from-UTC.
.parse(
    "21/01/1966" ,                               // String in some localized format. 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" )  // Specify formatting pattern to match input string.
)                                                // Returns a `LocalDate` object.
.isBefore(                                       // Compare one `LocalDate` to another.
    LocalDate.EPOCH                              // 1970-01-01
)                                                // Returns a boolean.

真正

java.time

僅使用現代java.time類,切勿使用SimpleDateFormatCalendar

LocalDate

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

解析

定義格式模式以匹配您的輸入字符串。

String input = "01/01/1970" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
LocalDate limit = LocalDate.parse( input , f ) ;

當前的日期

獲取今天的日期。

時區對於確定日期至關重要。 在任何給定時刻,日期都會在全球范圍內變化。 例如, 法國巴黎午夜過后幾分鍾是新的一天,而在魁北克蒙特利爾仍然是“昨天”。

如果未指定時區,則JVM隱式應用其當前的默認時區。 該默認值可能會在運行時(!)期間隨時更改 ,因此您的結果可能會有所不同。 最好將[期望/預期時區] [2]明確指定為參數。

continent/region的格式指定正確的時區名稱 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 切勿使用2-4字母的縮寫,例如ESTIST因為它們不是真實的時區,不是標准化的,甚至不是唯一的(!)。

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

如果要使用JVM的當前默認時區,請提出要求並作為參數傳遞。 如果省略,則隱式應用JVM的當前默認值。 最好明確一點,因為缺省值可以在運行時隨時由JVM中任何應用程序的任何線程中的任何代碼更改。

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

相比

boolean isBeforeLimit = today.isBefore( limit ) ;  // Returns false.

關於java.time

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

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

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

您可以直接與數據庫交換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