Як перевірити розумність дати на Java [закрито]


83

Мені цікаво, що найочевидніший спосіб створення Dateоб’єктів на Java застарів і, схоже, був «замінений» на не такий очевидний для використання м’який календар.

Як перевірити, чи є дата, вказана як поєднання дня, місяця та року, дійсною?

Наприклад, 2008-02-31 (як у рррр-мм-дд) буде недійсною датою.


Для тих, хто має подібне запитання, подумайте, чи потрібна вам негригоріанська підтримка календаря.
MSalters

@JasonC Я повністю з вами згоден, їх об’єднання виглядає найкращим способом.
acm

Відповіді:


37

Поточний спосіб - використовувати клас календаря. Він має метод setLenient, який перевірятиме дату та викид та виняток, якщо він виходить за межі діапазону, як у вашому прикладі.

Забули додати: Якщо ви отримуєте екземпляр календаря та встановлюєте час, використовуючи дату, ось як ви отримуєте перевірку.

Calendar cal = Calendar.getInstance();
cal.setLenient(false);
cal.setTime(yourDate);
try {
    cal.getTime();
}
catch (Exception e) {
  System.out.println("Invalid date");
}

2
не думайте, що це точно працює як є. Calendar.setTime бере java.util.Date, тому перетворення з рядка вже відбулося до того моменту, коли ви отримаєте об'єкт "yourDate".
тардати

32
3 проблеми з прикладом коду: 1. Після отримання екземпляра календаря потрібно викликати cal.setLenient (false). Інакше дату, як 31 лютого 2007 року, буде вважати дійсною. 2. Виняток не викликає cal.setTime (). Ви повинні викликати cal.getTime () після виклику setTime (), який видає виняток на недійсну дату. 3. Друкарська помилка: відсутній знак '}' перед уловом.
Лірон Ягдав,

Це також повільніше, ніж інші підходи. Дивіться stackoverflow.com/questions/2149680/…
деспот

5
FYI, клопітні старі класи часу та часу, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер є застарілими , витіснені класами java.time, вбудованими в Java 8 та пізніші версії. Див. Підручник Oracle .
Василь Бурк

3
не перевіряє дати, як 31 лютого
Шиха Сінгх,

78

Ключ df.setLenient (false); . Цього більш ніж достатньо для простих справ. Якщо ви шукаєте більш надійну (я сумніваюся) та / або альтернативні бібліотеки, такі як joda-time, тоді подивіться на відповідь користувача "tardate"

final static String DATE_FORMAT = "dd-MM-yyyy";

public static boolean isDateValid(String date) 
{
        try {
            DateFormat df = new SimpleDateFormat(DATE_FORMAT);
            df.setLenient(false);
            df.parse(date);
            return true;
        } catch (ParseException e) {
            return false;
        }
}

2
Спробуйте з "09-04-201a". Це створить шалене побачення.
ceklock

@ceklock так працює, незалежно від того, використовуєте ви setLenientчи ні: SimpleDateFormatзавжди буде аналізувати, доки шаблон не буде збігатися, і ігноруватиме решту рядка, таким чином ви отримаєте 201як рік.
Даніель Набер,

@ceklock Я щойно звернувся до нього у своєму рішенні . Для когось це може заощадити хвилину чи дві.
Суфіян

1
Включення обробки винятків тягне за собою значне погіршення продуктивності, тому це, мабуть, поганий дизайн, ЯКЩО ви очікуєте неправильного введення при нормальній роботі (наприклад, перевірка введення користувачем). Але якщо метод використовується як подвійна перевірка вхідних даних, які повинні бути дійсними постійно (крім помилок), це нормально.
Аарон,

2
FYI, страшенно неприємні старі класи часу та часу, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер є застарілими , витіснені класами java.time, вбудованими в Java 8 та пізніші версії. Див. Підручник Oracle .
Василь Бурк

48

Як показав @Maglob, основним підходом є перевірка перетворення з рядка на дату за допомогою SimpleDateFormat.parse . Це вловить недійсні комбінації день / місяць, як 2008-02-31.

Однак на практиці цього буває досить рідко, оскільки SimpleDateFormat.parse надзвичайно ліберальний. Існує дві поведінки, які можуть вас турбувати:

Недійсні символи у рядку дат. На диво, наприклад, 2008-02-2x буде "передаватися" як дійсну дату з локальним форматом = "рррр-ММ-дд". Навіть коли isLenient == false.

Роки: 2, 3 або 4 цифри? Можливо, ви також захочете застосувати 4-значні роки, а не дозволяти поведінку SimpleDateFormat за замовчуванням (що буде інтерпретувати "12-02-31" по-різному, залежно від того, чи був ваш формат "yyyy-MM-dd" або "yy-MM-dd" )

Суворе рішення зі стандартною бібліотекою

Отже, повний рядок тестування дати може виглядати так: комбінація регулярного виразу, а потім примусове перетворення дати. Фокус у регулярному виразі полягає в тому, щоб зробити його привабливим для місцевості.

  Date parseDate(String maybeDate, String format, boolean lenient) {
    Date date = null;

    // test date string matches format structure using regex
    // - weed out illegal characters and enforce 4-digit year
    // - create the regex based on the local format string
    String reFormat = Pattern.compile("d+|M+").matcher(Matcher.quoteReplacement(format)).replaceAll("\\\\d{1,2}");
    reFormat = Pattern.compile("y+").matcher(reFormat).replaceAll("\\\\d{4}");
    if ( Pattern.compile(reFormat).matcher(maybeDate).matches() ) {

      // date string matches format structure, 
      // - now test it can be converted to a valid date
      SimpleDateFormat sdf = (SimpleDateFormat)DateFormat.getDateInstance();
      sdf.applyPattern(format);
      sdf.setLenient(lenient);
      try { date = sdf.parse(maybeDate); } catch (ParseException e) { }
    } 
    return date;
  } 

  // used like this:
  Date date = parseDate( "21/5/2009", "d/M/yyyy", false);

Зверніть увагу, що регулярний вираз передбачає, що рядок формату містить лише день, місяць, рік та символи-роздільники. Окрім цього, формат може бути у будь-якому мовному форматі: "д / ММ / рр", "рррр-ММ-дд" тощо. Рядок формату для поточної мови можна отримати таким чином:

Locale locale = Locale.getDefault();
SimpleDateFormat sdf = (SimpleDateFormat)DateFormat.getDateInstance(DateFormat.SHORT, locale );
String format = sdf.toPattern();

Joda Time - краща альтернатива?

Я нещодавно чув про час йоди і думав порівняти. Два моменти:

  1. Виглядає краще суворо ставитись до неприпустимих символів у рядку дати, на відміну від SimpleDateFormat
  2. Поки що не бачу способу застосувати до нього 4-значний рік (але, мабуть, для цього ви можете створити власний DateTimeFormatter )

Це досить просто у використанні:

import org.joda.time.format.*;
import org.joda.time.DateTime;

org.joda.time.DateTime parseDate(String maybeDate, String format) {
  org.joda.time.DateTime date = null;
  try {
    DateTimeFormatter fmt = DateTimeFormat.forPattern(format);
    date =  fmt.parseDateTime(maybeDate);
  } catch (Exception e) { }
  return date;
}

Я опинився з альтернативою joda і сам перевірив, чи відповідає значення довжині шаблону ...
Xtreme Biker

Оновлення: Жахливі старі застарілі класи ( Date, SimpleDateFormatтощо) тепер витіснені сучасними класами java.time . Так само проект Joda-Time перебуває в режимі обслуговування і радить перехід на класи java.time .
Василь Бурк

38

Ви можете використовувати SimpleDateFormat

Наприклад щось на зразок:

boolean isLegalDate(String s) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    sdf.setLenient(false);
    return sdf.parse(s, new ParsePosition(0)) != null;
}

2
Однією з проблем цього підходу є те, що він приймає 0003-0002-001.
деспот

1
Інша проблема полягає в тому, що встановлення 13 у місяці повертає дату, де місяць є 01 наступного року.
8bitjunkie

FYI, страшенно неприємні старі класи часу та часу, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер є застарілими , витіснені класами java.time, вбудованими в Java 8 та пізніші версії. Див. Підручник Oracle .
Василь Бурк

29

tl; д-р

Використовуйте строгий режим на java.time.DateTimeFormatterрозібрати LocalDate. Пастка для DateTimeParseException.

LocalDate.parse(                   // Represent a date-only value, without time-of-day and without time zone.
    "31/02/2000" ,                 // Input string.
    DateTimeFormatter              // Define a formatting pattern to match your input string.
    .ofPattern ( "dd/MM/uuuu" )
    .withResolverStyle ( ResolverStyle.STRICT )  // Specify leniency in tolerating questionable inputs.
)

Після синтаксичного аналізу ви можете перевірити на розумну вартість. Наприклад, дата народження протягом останніх ста років.

birthDate.isAfter( LocalDate.now().minusYears( 100 ) )

Уникайте застарілих класів дати та часу

Уникайте проблемних старих класів дати та часу, що постачаються з найранішими версіями Java. Тепер витіснено класами java.time .

LocalDate& DateTimeFormatter&ResolverStyle

LocalDateКлас являє собою дату тільки значення без часу доби і без часового поясу.

String input = "31/02/2000";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "dd/MM/uuuu" );
try {
    LocalDate ld = LocalDate.parse ( input , f );
    System.out.println ( "ld: " + ld );
} catch ( DateTimeParseException e ) {
    System.out.println ( "ERROR: " + e );
}

Для java.time.DateTimeFormatterкласу можна встановити синтаксичний аналіз рядків з будь-яким із трьох режимів поблажливості, визначених у ResolverStyleпереліку. Ми вставляємо рядок у наведений вище код, щоб спробувати кожен з режимів.

f = f.withResolverStyle ( ResolverStyle.LENIENT );

Результати:

  • ResolverStyle.LENIENT
    ld: 2000-03-02
  • ResolverStyle.SMART
    ld: 2000-02-29
  • ResolverStyle.STRICT
    ПОМИЛКА: java.time.format.DateTimeParseException: Текст '31 / 02/2000 'не вдалося проаналізувати: Недійсна дата' 31 ЛЮТОГО '

Ми бачимо, що в ResolverStyle.LENIENTрежимі недійсна дата переміщується вперед на еквівалентну кількість днів. У ResolverStyle.SMARTрежимі (за замовчуванням) приймається логічне рішення зберігати дату в межах місяця і рухатись з останнім можливим днем ​​місяця, 29 лютого у високосний рік, оскільки в цьому місяці немає 31 числа. ResolverStyle.STRICTРежим кидає виняток скаржиться , що немає такої дати.

Усі ці три є обґрунтованими залежно від вашої ділової проблеми та політики. Здається, у вашому випадку ви хочете, щоб суворий режим відхиляв недійсну дату, а не коригував її.


Таблиця всіх типів дати та часу в Java, як сучасних, так і застарілих.


Про java.time

Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.

Щоб дізнатись більше, див. Підручник Oracle . І шукайте в Stack Overflow багато прикладів та пояснень. Специфікація - JSR 310 .

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

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

Де отримати класи java.time?

Таблиця, яку бібліотеку java.time використовувати з якою версією Java або Android

Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є полігоном для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .


Ну, припустимо, що проект компілюється з java 8+, тоді ваша відповідь правильна. Я також використовую ці класи, коли проект знаходиться у java 8. Але іноді мені доводиться торкатися тих потворних старовинних скриплетів jsp (які навіть не підтримують java 7). Підтвердження дат є біль. Отже, я тут. Тим не менше, ваша відповідь - найбільш правильний підхід ... Висновок.
KarelG

@KarelG Перечитайте цей останній абзац про зворотний порт до Java 6 і Java 7 . Я не перевірив цю поведінку на задньому порту, але пропоную спробувати.
Василь Бурк,

13

java.time

За допомогою API дати та часу ( класи java.time ), вбудованого в Java 8 та новіших версій, ви можете використовувати LocalDateклас.

public static boolean isDateValid(int year, int month, int day) {
    boolean dateIsValid = true;
    try {
        LocalDate.of(year, month, day);
    } catch (DateTimeException e) {
        dateIsValid = false;
    }
    return dateIsValid;
}

2
За замовчуванням цей код використовує, ResolverStyle.SMARTщо налаштовує отримане значення на дійсну дату, а не створює виняток. Отже, цей код не досягти мети Питання. Див. Мою відповідь, наприклад, і рішення щодо використання ResolverStyle.STRICT.
Василь Бурк

7

Альтернативне суворе рішення із використанням стандартної бібліотеки полягає у виконанні наступних дій:

1) Створіть строгий SimpleDateFormat за вашим зразком

2) Спроба проаналізувати введене користувачем значення за допомогою об’єкта форматування

3) У разі успіху переформатуйте дату, отриману з (2), використовуючи той самий формат дати (з (1))

4) Порівняйте переформатовану дату з вихідним, введеним користувачем значенням. Якщо вони рівні, тоді введене значення суворо відповідає вашому шаблону.

Таким чином, вам не потрібно створювати складні регулярні вирази - у моєму випадку мені потрібно було підтримувати весь синтаксис шаблону SimpleDateFormat, а не обмежуватися певними типами, такими як лише дні, місяці та роки.


Це точно шлях, див. Також зразок коду на dreamincode.net/forums/topic/…
Віктор

7

Спираючись на відповідь Аравінда, щоб виправити проблему, на яку вказав ceklock у своєму коментарі , я додав метод, щоб перевірити, dateStringчи не містить недійсний символ.

Ось як я роблю:

private boolean isDateCorrect(String dateString) {
    try {
        Date date = mDateFormatter.parse(dateString);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return matchesOurDatePattern(dateString);    //added my method
    }
    catch (ParseException e) {
        return false;
    }
}

/**
 * This will check if the provided string matches our date format
 * @param dateString
 * @return true if the passed string matches format 2014-1-15 (YYYY-MM-dd)
 */
private boolean matchesDatePattern(String dateString) {
    return dateString.matches("^\\d+\\-\\d+\\-\\d+");
}

5

Я думаю, що найпростішим є просто перетворити рядок в об’єкт дати і перетворити його назад у рядок. Даний рядок дати є нормальним, якщо обидва рядки все ще збігаються.

public boolean isDateValid(String dateString, String pattern)
{   
    try
    {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        if (sdf.format(sdf.parse(dateString)).equals(dateString))
            return true;
    }
    catch (ParseException pe) {}

    return false;
}

4

Я пропоную вам використовувати org.apache.commons.validator.GenericValidatorклас від apache.

GenericValidator.isDate(String value, String datePattern, boolean strict);

Примітка: суворо - чи потрібно мати точну відповідність шаблону дати.


2

Якщо припустити, що обидва вони є рядками (інакше вони вже були б дійсними датами), ось один із способів:

package cruft;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateValidator
{
    private static final DateFormat DEFAULT_FORMATTER;

    static
    {
        DEFAULT_FORMATTER = new SimpleDateFormat("dd-MM-yyyy");
        DEFAULT_FORMATTER.setLenient(false);
    }

    public static void main(String[] args)
    {
        for (String dateString : args)
        {
            try
            {
                System.out.println("arg: " + dateString + " date: " + convertDateString(dateString));
            }
            catch (ParseException e)
            {
                System.out.println("could not parse " + dateString);
            }
        }
    }

    public static Date convertDateString(String dateString) throws ParseException
    {
        return DEFAULT_FORMATTER.parse(dateString);
    }
}

Ось результат, який я отримую:

java cruft.DateValidator 32-11-2010 31-02-2010 04-01-2011
could not parse 32-11-2010
could not parse 31-02-2010
arg: 04-01-2011 date: Tue Jan 04 00:00:00 EST 2011

Process finished with exit code 0

Як бачите, він прекрасно справляється з обома вашими справами.


@duffymo друге твердження не викликає винятків ... :(
maximus

@Pangea Не дуже .... спробуйте цю дату "31-01-2010", це не призведе до винятків .......... Просто запустіть її на своїй машині і подивіться ... це не робота ....
sasidhar

Моє ліжко. Я видалив свій коментар. Але друге твердження для мене є винятком. @duffymo - який jvm ти використовуєш?
Aravind Yarram

@Pangea я використовую jdk1.6.0_23 Я спробував це з цим навіть joda-time.sourceforge.net, але навіть це не спрацювало ....
sasidhar

1
Я розумію, що це лише простий тест, але щоб просто переконатись, що люди не копіюють це дослівне слово, я хочу сказати, що "DateFormat" НЕ БЕЗПЕЧНО. Тому завжди створюйте його як локальну змінну або використовуйте з потоком local.
Aravind Yarram

2

Це чудово працює для мене. Підхід, запропонований Бену вище.

private static boolean isDateValid(String s) {
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    try {
        Date d = asDate(s);
        if (sdf.format(d).equals(s)) {
            return true;
        } else {
            return false;
        }
    } catch (ParseException e) {
        return false;
    }
}

1
не можу розпізнати asDate. Що це?
Susheel

2

схоже, що SimpleDateFormat не перевіряє шаблон суворо навіть після setLenient (false); до нього застосовано метод, тому я використав наведений нижче метод для перевірки того, чи введена дата є дійсною датою чи ні відповідно до наданого зразка.

import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
public boolean isValidFormat(String dateString, String pattern) {
    boolean valid = true;
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
    try {
        formatter.parse(dateString);
    } catch (DateTimeParseException e) {
        valid = false;
    }
    return valid;
}

1

Два коментарі щодо використання SimpleDateFormat.

його слід оголосити як статичний екземпляр, якщо оголошено як статичний доступ, слід синхронізувати, оскільки він не є потокобезпечним

IME, який краще, ніж створення екземпляра для кожного аналізу дати.


хороший момент Томе. Я оновив приклад, який надав, щоб переконатися у послідовному використанні статичного екземпляра.
tardate

Використання синхронізованої функції може не мати масштабу для деяких проектів. Я б рекомендував помістити SimpleDateFormat у змінну ThreadLocal замість статичної змінної, до якої можна отримати доступ через синхронізовану функцію.
user327961

0

Вищезазначені методи синтаксичного аналізу дати є приємними, я щойно додав нову перевірку до існуючих методів, яка подвійно перевіряє перетворену дату з оригінальною датою за допомогою форматера, тому вона працює майже в кожному випадку, як я перевірив. наприклад, 29.02.2013 недійсна дата. Дана функція аналізує дату відповідно до поточних прийнятних форматів дат. Повертає true, якщо дата не проаналізована успішно.

 public final boolean validateDateFormat(final String date) {
        String[] formatStrings = {"MM/dd/yyyy"};
        boolean isInvalidFormat = false;
        Date dateObj;
        for (String formatString : formatStrings) {
            try {
                SimpleDateFormat sdf = (SimpleDateFormat) DateFormat.getDateInstance();
                sdf.applyPattern(formatString);
                sdf.setLenient(false);
                dateObj = sdf.parse(date);
                System.out.println(dateObj);
                if (date.equals(sdf.format(dateObj))) {
                    isInvalidFormat = false;
                    break;
                }
            } catch (ParseException e) {
                isInvalidFormat = true;
            }
        }
        return isInvalidFormat;
    }

0

Ось що я зробив для середовища Node, не використовуючи зовнішніх бібліотек:

Date.prototype.yyyymmdd = function() {
   var yyyy = this.getFullYear().toString();
   var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based
   var dd  = this.getDate().toString();
   return zeroPad([yyyy, mm, dd].join('-'));  
};

function zeroPad(date_string) {
   var dt = date_string.split('-');
   return dt[0] + '-' + (dt[1][1]?dt[1]:"0"+dt[1][0]) + '-' + (dt[2][1]?dt[2]:"0"+dt[2][0]);
}

function isDateCorrect(in_string) {
   if (!matchesDatePattern) return false;
   in_string = zeroPad(in_string);
   try {
      var idate = new Date(in_string);
      var out_string = idate.yyyymmdd();
      return in_string == out_string;
   } catch(err) {
      return false;
   }

   function matchesDatePattern(date_string) {
      var dateFormat = /[0-9]+-[0-9]+-[0-9]+/;
      return dateFormat.test(date_string); 
   }
}

І ось як його використовувати:

isDateCorrect('2014-02-23')
true

0
// to return valid days of month, according to month and year
int returnDaysofMonth(int month, int year) {
    int daysInMonth;
    boolean leapYear;
    leapYear = checkLeap(year);
    if (month == 4 || month == 6 || month == 9 || month == 11)
        daysInMonth = 30;
    else if (month == 2)
        daysInMonth = (leapYear) ? 29 : 28;
    else
        daysInMonth = 31;
    return daysInMonth;
}

// to check a year is leap or not
private boolean checkLeap(int year) {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, year);
    return cal.getActualMaximum(Calendar.DAY_OF_YEAR) > 365;
}

0

Ось я б перевірив формат дати:

 public static boolean checkFormat(String dateTimeString) {
    return dateTimeString.matches("^\\d{4}-\\d{2}-\\d{2}") || dateTimeString.matches("^\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2}")
            || dateTimeString.matches("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}") || dateTimeString
            .matches("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z") ||
            dateTimeString.matches("^\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2}Z");
}

Зараз у нас є сучасні класи Java.time для цієї роботи. Написання складних регулярних виразів, мабуть, не найкращий спосіб використовувати ваш час. Див. Односторонню підкладку в моїй відповіді .
Basil Bourque

0
        public static String detectDateFormat(String inputDate, String requiredFormat) {
        String tempDate = inputDate.replace("/", "").replace("-", "").replace(" ", "");
        String dateFormat;

        if (tempDate.matches("([0-12]{2})([0-31]{2})([0-9]{4})")) {
            dateFormat = "MMddyyyy";
        } else if (tempDate.matches("([0-31]{2})([0-12]{2})([0-9]{4})")) {
            dateFormat = "ddMMyyyy";
        } else if (tempDate.matches("([0-9]{4})([0-12]{2})([0-31]{2})")) {
            dateFormat = "yyyyMMdd";
        } else if (tempDate.matches("([0-9]{4})([0-31]{2})([0-12]{2})")) {
            dateFormat = "yyyyddMM";
        } else if (tempDate.matches("([0-31]{2})([a-z]{3})([0-9]{4})")) {
            dateFormat = "ddMMMyyyy";
        } else if (tempDate.matches("([a-z]{3})([0-31]{2})([0-9]{4})")) {
            dateFormat = "MMMddyyyy";
        } else if (tempDate.matches("([0-9]{4})([a-z]{3})([0-31]{2})")) {
            dateFormat = "yyyyMMMdd";
        } else if (tempDate.matches("([0-9]{4})([0-31]{2})([a-z]{3})")) {
            dateFormat = "yyyyddMMM";
        } else {
            return "Pattern Not Added";
//add your required regex
        }
        try {
            String formattedDate = new SimpleDateFormat(requiredFormat, Locale.ENGLISH).format(new SimpleDateFormat(dateFormat).parse(tempDate));

            return formattedDate;
        } catch (Exception e) {
            //
            return "";
        }

    }

0

За допомогою “застарілого” формату дати ми можемо відформатувати результат і порівняти його з вихідним.

    public boolean isValidFormat(String source, String pattern) {
    SimpleDateFormat sd = new SimpleDateFormat(pattern);
    sd.setLenient(false);
    try {
        Date date = sd.parse(source);
        return date != null && sd.format(date).equals(source);
    } catch (Exception e) {
        return false;
    }
}

У цій уривці сказано 'false' до джерела = 01.01.04 із шаблоном '01 .01.2004 '


-1

setLenient на false, якщо вам подобається сувора перевірка

public boolean isThisDateValid(String dateToValidate, String dateFromat){

    if(dateToValidate == null){
        return false;
    }

    SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
    sdf.setLenient(false);

    try {

        //if not valid, it will throw ParseException
        Date date = sdf.parse(dateToValidate);
        System.out.println(date);

    } catch (ParseException e) {

        e.printStackTrace();
        return false;
    }

    return true;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.