Java: проверьте формат даты текущей строки в соответствии с требуемым форматом или нет.
Я хотел знать, что есть способ, доступный в Java, который может это сделать. В противном случае я могу пойти на решение Regex.
У меня есть строка ввода от пользователя, которая может быть любыми символами. И я хочу проверить, что строка ввода соответствует моему формату даты или нет.
Поскольку у меня есть вход 20130925, и мой требуемый формат dd/MM/yyyy, поэтому для этого случая я должен получить false.
Я не хочу конвертировать эту дату, я просто хочу проверить, соответствует ли строка ввода в соответствии с требуемым форматом даты или нет.
Я пробовал следовать
Date date = null;
try {
date = new SimpleDateFormat("dd/MM/yyyy").parse("20130925");
} catch (Exception ex) {
// do something for invalid dateformat
}
но блок catch (Exception ex) не может поймать исключения, сгенерированные SimpleDateFormat.Parse();
Ответы
Ответ 1
Простая попытка и разобрать String
на требуемый Date
, используя что-то вроде SimpleDateFormat
Date date = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat(format);
date = sdf.parse(value);
if (!value.equals(sdf.format(date))) {
date = null;
}
} catch (ParseException ex) {
ex.printStackTrace();
}
if (date == null) {
// Invalid date format
} else {
// Valid date format
}
Затем вы можете просто написать простой метод, который выполнил это действие, и возвратил true
, когда Date
не был null...
Как предложение...
Обновлен с запущенным примером
Я не уверен, что вы делаете, но, следующий пример...
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestDateParser {
public static void main(String[] args) {
System.out.println("isValid - dd/MM/yyyy with 20130925 = " + isValidFormat("dd/MM/yyyy", "20130925"));
System.out.println("isValid - dd/MM/yyyy with 25/09/2013 = " + isValidFormat("dd/MM/yyyy", "25/09/2013"));
System.out.println("isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = " + isValidFormat("dd/MM/yyyy", "25/09/2013 12:13:50"));
}
public static boolean isValidFormat(String format, String value) {
Date date = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat(format);
date = sdf.parse(value);
if (!value.equals(sdf.format(date))) {
date = null;
}
} catch (ParseException ex) {
ex.printStackTrace();
}
return date != null;
}
}
Выходы (что-то типа)...
java.text.ParseException: Unparseable date: "20130925"
isValid - dd/MM/yyyy with 20130925 = false
isValid - dd/MM/yyyy with 25/09/2013 = true
isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = false
at java.text.DateFormat.parse(DateFormat.java:366)
at javaapplication373.JavaApplication373.isValidFormat(JavaApplication373.java:28)
at javaapplication373.JavaApplication373.main(JavaApplication373.java:19)
Неправильно. Для isValidFormat ( "yyyy-MM-dd", "2017-18-15" ); не выбрасывать исключение.
isValid - yyyy-MM-dd", "2017-18--15 = false
Кажется, что работает для меня - метод не полагается (и не бросает) только исключение для выполнения операции
Ответ 2
В вашем случае вы можете использовать регулярное выражение:
boolean checkFormat;
if (input.matches("([0-9]{2})/([0-9]{2})/([0-9]{4})"))
checkFormat=true;
else
checkFormat=false;
Для большей области действия или если вы хотите получить гибкое решение, обратитесь к ответу от MadProgrammer.
Ответ 3
Вы можете попробовать это для простого формата даты valdation
public Date validateDateFormat(String dateToValdate) {
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HHmmss");
//To make strict date format validation
formatter.setLenient(false);
Date parsedDate = null;
try {
parsedDate = formatter.parse(dateToValdate);
System.out.println("++validated DATE TIME ++"+formatter.format(parsedDate));
} catch (ParseException e) {
//Handle exception
}
return parsedDate;
}
Ответ 4
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
formatter.setLenient(false);
try {
Date date= formatter.parse("02/03/2010");
} catch (ParseException e) {
//If input date is in different format or invalid.
}
formatter.setLenient(false) будет обеспечивать строгое соответствие.
Если вы используете Joda-Time -
private boolean isValidDate(String dateOfBirth) {
boolean valid = true;
try {
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy");
DateTime dob = formatter.parseDateTime(dateOfBirth);
} catch (Exception e) {
valid = false;
}
return valid;
}
Ответ 5
Комбинация регулярного выражения и SimpleDateFormat - правильный ответ, на который я верю. SimpleDateFormat не вызывает исключения, если отдельные компоненты являются недопустимыми,
Формат: yyyy-mm-dd
вход: 201-0-12
Никакое исключение не будет выбрано. В этом случае необходимо было обработать.
Но с регулярным выражением, предложенным Соком Помаранцовым и Ребенком, он позаботится об этом конкретном случае.
Ответ 6
Вот простой способ:
public static boolean checkDatePattern(String padrao, String data) {
try {
SimpleDateFormat format = new SimpleDateFormat(padrao, LocaleUtils.DEFAULT_LOCALE);
format.parse(data);
return true;
} catch (ParseException e) {
return false;
}
}
Ответ 7
Например, если вы хотите, чтобы формат даты был "03.11.2017"
if (String.valueOf(DateEdit.getText()).matches("([1-9]{1}|[0]{1}[1-9]{1}|[1]{1}[0-9]{1}|[2]{1}[0-9]{1}|[3]{1}[0-1]{1})" +
"([.]{1})" +
"([0]{1}[1-9]{1}|[1]{1}[0-2]{1}|[1-9]{1})" +
"([.]{1})" +
"([20]{2}[0-9]{2})"))
checkFormat=true;
else
checkFormat=false;
if (!checkFormat) {
Toast.makeText(getApplicationContext(), "incorrect date format! Ex.23.06.2016", Toast.LENGTH_SHORT).show();
}
Ответ 8
Для этого можно использовать Regex с некоторой подробной информацией для проверки, например, этот код может использоваться для подтверждения любой даты в формате (DD/MM/yyyy) с правильной датой и месячным значением и годом между (1950-2050)
public Boolean checkDateformat(String dateToCheck){
String rex="([0]{1}[1-9]{1}|[1-2]{1}[0-9]{1}|[3]{1}[0-1]{1})+
\/([0]{1}[1-9]{1}|[1]{1}[0-2]{2})+
\/([1]{1}[9]{1}[5-9]{1}[0-9]{1}|[2]{1}[0]{1}([0-4]{1}+
[0-9]{1}|[5]{1}[0]{1}))";
return(dateToCheck.matches(rex));
}
Ответ 9
Так как я не могу комментировать, я добавлю к @Jonjongot ответ, что вы можете просто
return input.matches("([0-9]{2})/([0-9]{2})/([0-9]{4})")