Как вы сравниваете дату, предыдущую дату и будущую дату в Java? - PullRequest
0 голосов
/ 24 ноября 2018

Перед регистрацией человека мне необходимо подтвердить, что дата рождения не превышает предыдущую дату, например (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"));
            }
        }

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

tl; dr

Используйте современные классы, в частности 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.time

Используйте только современные java.time классы, никогда SimpleDateFormat или Calendar.

LocalDate

Класс LocalDate представляет значение только для даты без времени суток и без часового пояса или смещение от UTC .

Синтаксический анализ

Определение шаблона форматирования для соответствия вашей входной строке.

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

Текущая дата

Получить сегодняшнюю дату.

Часовой пояс имеет решающее значение при определении даты.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .

Если часовой пояс не указан,JVM неявно применяет свой текущий часовой пояс по умолчанию.Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться.Лучше явно указать в качестве аргумента [желаемый / ожидаемый часовой пояс] [2].

Укажите правильное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.Никогда не используйте 2-4 буквенные сокращения, такие как EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

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.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесены в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 24 ноября 2018

Следующие строки недопустимы и не выполняют то, что, как вы думаете, они должны:

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

Похоже, вы хотите проверить, что значение, возвращаемое persona.getFechNac(), является датой после 01/01 /1970 и раньше или равны текущей дате.

Правильный способ сделать это примерно так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...