Проверить, является ли строка действительной датой

Я хочу поместить в конструктор аргумент типа Date, поэтому я подумал, что лучший способ сделать это - написать метод, преобразующий строку в дату. Какой самый простой способ проверить, является ли моя строка действительной датой?

Это мой конструктор:

Product product = new Product("Produs 1", 312.33, updateDate("23/12/2018"));

И это метод, который преобразует String в Date.

public static Date updateDate(String date) {
    Date newDate = new Date();
    try {
        DateFormat dtF = new SimpleDateFormat("dd/MM/yyyy");
        newDate = dtF.parse(date);
        return newDate;
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return newDate;
}

person John R.    schedule 18.06.2018    source источник
comment
Вы можете разобрать его так, но не возвращайте текущую дату, если она недействительна: выбросите исключение или верните Optional. В противном случае, как определить разницу между указанием неверной даты и текущей датой?   -  person Andy Turner    schedule 18.06.2018
comment
Если вы ожидаете недопустимые даты, подумайте о возврате Optional<Date>. Кроме того, updateDate() сбивает с толку метод синтаксического анализа даты.   -  person shmosel    schedule 18.06.2018
comment
Я рекомендую вам избегать класса SimpleDateFormat. Это не только давно устарело, но и доставит много хлопот. Сегодня у нас намного лучше java.time, современный API даты и времени Java.   -  person Ole V.V.    schedule 19.06.2018


Ответы (1)


Я бы сохранил блок try-catch как можно меньше. Кроме того, в случае возникновения проблем с синтаксическим анализом строки я бы вернул Optional<Date> вместо вновь созданного объекта date.

public static Optional<Date> getDateFromString(String s) {
    Date date = null;
    DateFormat dtF = new SimpleDateFormat("dd/MM/yyyy");
    try {
        date = dtF.parse(s);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return Optional.ofNullable(date);
}

Хорошая практика - называть функцию более понятным именем, например getDateFromString.

person BrainArchitect    schedule 18.06.2018
comment
Это не означает для вызывающего абонента, что он потерпел неудачу, потому что необязательный параметр все еще имеет значение. - person Evan Knowles; 18.06.2018
comment
Привет и спасибо за ответ! Если я верну Optional.ofNullable (date); Я получаю сообщение об ошибке: Ошибка: (23, 35) java: несовместимые типы: не существует экземпляров переменной (ов) типа T, поэтому java.util.Optional ‹T› соответствует java.util.Date - person John R.; 18.06.2018
comment
К вашему сведению, неприятные старые классы даты и времени, такие как java.util.Date , java.util.Calendar и java.text.SimpleDateFormat теперь являются устаревшими, замененными java.time классы, встроенные в Java 8 и новее. См. Руководство от Oracle. - person Basil Bourque; 19.06.2018
comment
Разве в сигнатуре метода не должно быть указано Optional< Date >, а не Date? - person Basil Bourque; 19.06.2018
comment
В этом коде есть несколько ошибок. - person Ole V.V.; 19.06.2018
comment
@BasilBourque, да, я исправил это сейчас! Спасибо! :) - person BrainArchitect; 20.06.2018