2015-02-02 6 views
3

У меня есть строка, которая может содержать дату (yyyy-MM-dd) или дату и время (yyyy-MM-dd HH: mm: ss) в соответствующих форматах.Проверьте, содержит ли строка только дату

Я хочу знать, какие строки содержат только дату.

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
System.out.println(dateFormat.parse("2015-02-02")); 
System.out.println(dateFormat.parse("2015-02-02 23:23:23")); 

В приведенном выше коде обе строки успешно разбираются, тогда как формат является таким же для первого.

+0

использовать регулярное выражение. – Shriram

+3

Для этого конкретного шаблона вы можете просто проверить, что длина ввода равна 10. Для шаблонов переменной длины это немного сложнее - существуют альтернативные методы анализа, которые позволяют вам видеть, сколько строк было проанализировано. (См. 'Parse (String, ParsePosition)'.) –

+0

@JonSkeet Я также подумал об этом решении, но это похоже на альтернативу. –

ответ

3

Я хотел бы использовать перегрузку parse, которая принимает ParsePosition - то вы можете проверить положение после:

import java.util.*; 
import java.text.*; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
     dateFormat.setLenient(false); 
     System.out.println(parseFully(dateFormat, "2015-02-02")); 
     System.out.println(parseFully(dateFormat, "2015-02-02 23:23:23")); 
    } 

    private static Date parseFully(DateFormat format, String text) 
      throws ParseException { 
     ParsePosition position = new ParsePosition(0); 
     Date date = format.parse(text, position); 
     if (position.getIndex() == text.length()) { 
      return date; 
     } 
     if (date == null) { 
      throw new ParseException("Date could not be parsed: " + text, 
            position.getErrorIndex()); 
     } 
     throw new ParseException("Date was parsed incompletely: " + text, 
           position.getIndex()); 
    } 
} 
+0

Спасибо за идею. Я думаю, что сравнение длины шаблона и длины строки даты является наилучшим возможным решением. –

+0

@SahilJain: Это прекрасно * если * это шаблон с фиксированной длиной. Если у вас есть шаблон типа «EEE dd MMM yyyy», тогда он не будет работать. –

+0

О, это здорово. Таким образом, этот ответ решил проблему. –

0

Как только желаемое format достигнуто, SimpleDateFormat не форматирует остальную часть String. Именно по этой причине ваша вторая строка анализируется.

Это сообщение SimpleDateFormat parse(string str) doesn't throw an exception when str = 2011/12/12aaaaaaaaa? может вам помочь.

проверить также метод DateFormat#parse В Java Документах

+0

Да, я понимаю, что там делает java. Но я ищу хорошее решение для своей проблемы, а также хочу понять, почему Java не проверяет целую строку. Я также попытался установить снисходительность к false, все еще не в состоянии найти нужный результат. –

+0

Вы прочитали ответы в сообщении, это позволит вам очистить. комментарий, если вы не понимаете :) –

2
public static void main(String[] args) { 
     String dateOnly = "2015-02-02"; 
     String dateAndTimeOnly = "2015-02-02 23:23:23"; 
     System.out.println("Date Only = " + validateDateFormat(dateOnly)); 
     System.out.println("Date And time Only = " + validateDateFormat(dateAndTimeOnly)); 
    } 

    public static boolean validateDateFormat(String input) { 

     return input.matches("([0-9]{4})-([0-9]{2})-([0-9]{2})"); 
    } 

выход

Date Only = true 
Date And time Only = false 

Regex сам пояснительный - вход будет разделен - ИСТО части ([0-9]{4}) может содержать 4 цифры , 2-я часть может содержать 2 цифры [0-9]{2}, так что третий.

+0

Кажется, что излишний при проверке длины 10 или для присутствия. ':' также работают. Что бы этот реджикс поймал там, где это не удается? – user949300

+0

@ user949300 например, для ввода –

+0

O.k., да, в общем случае, или если пользователь вводит, вам нужно регулярное выражение. Тем не менее, ОП указал, что строки уже сильно ограничены и структурированы. – user949300

Смежные вопросы