Java:根据需要的格式检查当前string的date格式
我想知道有什么方法可以在Java中做到这一点。否则,我可能会去正则expression式的解决scheme。
我从用户inputstring,可以是任何字符。 我想检查input的string是否符合我的要求的date格式。
因为我input20130925和我所需的格式是dd / MM / yyyy所以,对于这种情况下,我应该是假的 。
我不想转换这个date我只是想检查inputstring是否符合要求的date格式。
我试过了
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()生成的任何exception。
使用SimpleDateFormat
东西,简单的尝试和parsingString
到所需的Date
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 }
然后,您可以简单地编写一个执行此操作的简单方法,并在Date
不为空时返回true
。
作为一个build议…
更新与运行的例子
我不知道你在做什么,但是,下面的例子…
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”); 不抛出任何exception。
isValid - yyyy-MM-dd", "2017-18--15 = false
似乎按预期对我工作 – 该方法不依赖(也不会抛出)执行它的操作的例外
对于你的情况,你可以使用正则expression式:
boolean checkFormat; if (input.matches("([0-9]{2})/([0-9]{2})/([0-9]{4})")) checkFormat=true; else checkFormat=false;
对于更大的范围,或者如果你想要一个灵活的解决scheme,请参阅MadProgrammer的答案。
你可以试试这个简单的date格式的值
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; }
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)将强制严格匹配。
如果你正在使用乔达时间 –
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; }
正则expression式和SimpleDateFormat的组合是我相信的正确答案。 SimpleDateFormat不捕获exception,如果单个组件是无效的意思,格式定义:yyyy-mm-ddinput:201-0-12没有exception将被抛出。这个案件应该已经处理。 但是,Sok Pomaranczowy和Baby提出的正则expression式会处理这个特殊情况。
这是一个简单的方法:
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; } }
例如,如果您希望date格式为“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(); }
正则expression式可用于此一些详细的信息进行validation,例如这个代码可以用于(DD / MM /
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)); }
由于我不能评论我会添加到@Jonjongot答案,你可以简单地
return input.matches("([0-9]{2})/([0-9]{2})/([0-9]{4})")