2015-08-22 15 views
5

Birisi bana, gösterilen giriş için false değerini döndürmek için aşağıdaki yöntemi nasıl alacağımı açıklayabilir mi? Beklemediğim bir şey olan true'u döndürüyor. Neden geçersiz bir tarih gerçek bir tarih olarak başarıyla ayrıştırılıyor?

isDateValid("19/06/2012 5:00, 21:00","dd/MM/yyyy HH:mm") 

Bu false dönmelidir düşünüyorum, ama görünüşe göre Java öyle düşünmüyor. Sağlanan gerçek tarih dizesi sonunda şu ek karakterleri içerir: ", 21:00".

public static boolean isDateValid(String date, String dateFormat) 
{ 
     try { 
      DateFormat df = new SimpleDateFormat(dateFormat); 
      df.setLenient(false); 
      Date newDate = df.parse(date); 
      System.out.println("Date value after checking for validity: " + newDate); 
      return true; 
     } catch (ParseException e) { 
      return false; 
     } 
} 

cevap

7

parse kesin olarak tüm String kullanmaz. Bu the Javadoc çok açıktır, vurgu mayın: bir tarih üretmek için verilen dizinin başlangıcından itibaren

parse

public Date parse(String source) throws ParseException

ayrıştırır metni. Yöntem, verilen dizenin tüm metnini kullanamaz. Tarih ayrıştırma hakkında daha fazla bilgi için parse(String, ParsePosition) yöntemine bakın. parse(String text, ParsePosition pos) kullanarak dize sonunda fazladan karakterler varsa


Sen algılayabilir. pos, Dizenin sonuna eşit değilse, sonunda fazladan karakterler kalıyordu.

İşte size uygun şekilde kontrol edecek test teçhizatını içeren bir çalışma programı. Bu programda, pos.getIndex() o şekilde çalışır eğer istediğiniz bu hiç de sonunda fazladan karakterler varsa çok küçük bir sayı ayrıştırmak olamazsa 0 olacak ve eşit olacaktır

public class DateFormatTest { 
    public static void main(String[] args) { 
    // should be false 
    System.out.println(isDateValid("19/06/2012 5:00, 21:00", "dd/MM/yyyy HH:mm")); 
    System.out.println(isDateValid("19/06/201", "dd/MM/yyyy HH:mm")); 

    System.out.println(); 

    // should be true 
    System.out.println(isDateValid("19/06/2012 5:00", "dd/MM/yyyy HH:mm")); 
    } 

    public static boolean isDateValid(String date, String dateFormat) { 
    ParsePosition pos = new ParsePosition(0); 
    DateFormat df = new SimpleDateFormat(dateFormat); 
    df.setLenient(false); 
    df.parse(date, pos); 

    return pos.getIndex() == date.length(); 
    } 
}