有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

验证在Java中如何比较日期、以前的日期和将来的日期?

在登记一个人之前,我需要确认出生日期不大于前一个日期,例如(1970年1月1日)和当前日期

不适合我的方法:

 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"));
            }
        }

共 (2) 个答案

  1. # 1 楼答案

    以下行无效,不符合您的要求:

    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的日期

  2. # 2 楼答案

    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.
    

    true

    爪哇。时间

    使用现代的java。仅限时间课程,从不SimpleDateFormatCalendar

    LocalDate

    {a1}类表示只包含日期的值,不包含一天中的时间,也不包含{a2}或offset-from-UTC

    解析

    定义与输入字符串匹配的格式模式

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

    当前日期

    今天的约会

    时区对确定日期至关重要。在任何一个特定的时刻,世界各地的日期因地区而异。例如,午夜过后几分钟在Paris France是新的一天,而在Montréal Québec仍然是“昨天”

    如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能在运行时(!)期间change at any moment,所以你的结果可能会有所不同。最好明确地将[desired/expected time zone][2]指定为参数

    continent/region的格式指定一个proper time zone name,例如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。时间

    java.time框架内置于Java8及更高版本中。这些类取代了麻烦的legacy日期时间类,比如^{}^{}、&^{}

    目前位于maintenance modeJoda-Time项目建议迁移到java.time

    要了解更多信息,请参阅Oracle Tutorial。并在Stack Overflow中搜索许多示例和解释。规范是JSR 310

    你可以交换java。时间对象直接与数据库连接。使用符合JDBC 4.2或更高版本的JDBC driver。不需要字符串,也不需要java.sql.*

    在哪里可以获得java。时间课

    {a31}项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如^{}^{}^{}more