2010-06-24 13 views
12

Chcę sprawdzać poprawność i parsować daty przy użyciu simpleDateFormat z formatem "rrrymmdd" Pozwala to również na 100624, który jest analizowany do 10 roku (54 lata po śmierci Juliusa Cezara). Daty będą również takie jak 1970, więc nie chcę się dogadać z SimpleDateFornat ("yymmdd").wymuszając 4 cyfry roku w jaime's simpledateformat

Zastanawiam się, czy istnieje sposób na wymuszenie czterocyfrowego formatu w formacie SimpleDateFormat? Jestem blisko zrobić test regexp z góry, ale może istnieje sprytny sposób korzystania z (Simple) DateFormat()?

Zgodnie z żądaniem kodu sprawy stają się coraz bardziej skomplikowane, a moje badania były o połowę mniejsze. Użyty format to rrrr-MM-dd (pochodzi on ze zmiennej, która miała nieprawidłowe javadoc). Jednak jak wskazano w odpowiedzi poniżej rrrrMMdd wymusza czteroletnią cyfrę. Moje pytanie zostało zmienione na "Jak wymusić czterocyfrowy rok dla formatu" rrrr-MM-dd ". I dlaczego "yyyyMMdd" zachowuje się inaczej?

public void testMaturity() { 
    try { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
     sdf.setLenient(false); 
     System.out.println(" " + sdf.format(sdf.parse("40-12-14"))); 
     SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd"); 
     sdf.setLenient(false); 
     System.out.println(" " + sdf2.format(sdf2.parse("401214"))); 
     fail(); 
    } catch (ParseException pe) { 
     assertTrue(true); 
    } 

która drukuje 0040-12-14

+0

Jeśli data wymaga rrrrmmdd wtedy lat 10 będzie 0010.Nie widzę w tym żadnego problemu, nie pozwalasz im wpisać 1 przez pierwszy dzień (01) lub przez pierwszy miesiąc, więc po co pozwalać na to przez lata. – Goibniu

Odpowiedz

3

Wystarczy użyć yyyyMMdd (uwaga! Górną obudowę M służy do wskazania miesięcy, w przeciwnym razie you're parsing minutes), a następnie sprawdzić, czy rok jest większa część data graniczna (dla Na przykład, podczas analizowania dat urodzenia, 1800 jest bezpiecznym zakładem, gdy parsowanie dat dla nadchodzących dat większych lub równych bieżącemu rokowi byłoby dobre).

2

Hmm. Podejrzewam, należy używać „mm” zamiast „mm” na początek ... ale „100624” nie analizować i tak, gdy próbuję go - nawet w trybie łagodniejszej:

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

public class Test 
{ 
    public static void main(String[] args) throws Exception 
    { 
     SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); 
     format.setLenient(true); 
     tryParse(format, "100624"); 
     format.setLenient(false); 
     tryParse(format, "100624"); 
    } 

    static void tryParse(DateFormat format, String text) 
    { 
     try 
     { 
      Date date = format.parse(text); 
      System.out.println("Parsed " + text + " to " + date); 
     } 
     catch (ParseException pe) 
     { 
      System.out.println("Failed to parse " + text); 
     } 
    } 
} 

(a nawet przy użyciu "mm" zamiast "mm" to nadal nie analizować)

Drukuje.

Failed to parse 100624 
Failed to parse 100624 

Może można pokazać kod, który jest starają się analizować to?

+0

Dzięki! Dodałem kod do przetestowania i okazało się, że formatString nie był zgodny z oczekiwaniami i że yyyyMMdd faktycznie wymusza 4-cyfrowy wymóg. Pozostaje typowe, że rrrr-MM-dd zachowuje się inaczej. –

2

Spróbuj zadzwonić pod numer setLenient(false); na obiekcie SimpleDateFormat - dzięki temu będzie on używał bardziej rygorystycznych reguł do parsowania (w przeciwnym razie będzie starał się być "inteligentny", jeśli wejściowy ciąg znaków nie jest dokładnie zgodny z formatem). Na przykład:

DateFormat df = new SimpleDateFormat("yyyyMMdd"); 
df.setLenient(false); 

i oczywiście, miesiąc jest MM nie mm.

1

Nie ma łatwego sposobu na to. Jeśli mówisz, że daty mogą być takie jak w 1970, główne pytanie brzmi: co oznacza 700624 - 1970 czy 2070? Powinieneś zaimplementować jakąś datę graniczną, taką jak proponowana Joachim, lub przenieść całkowicie na 4 cyfry roku.

1

Cóż, to jest całkiem proste i do przodu. Wykonaj następujące czynności:

Krok 1:

try { 
    String dates = "40-12-14"; 
    String patterns = "yy-MM-dd"; 
    SimpleDateFormat format3 = new SimpleDateFormat(patterns);`` 
    java.util.Date dates1 = format3.parse(dates); 

    SimpleDateFormat sdfDates = new SimpleDateFormat("dd/MM/yyyy"); 

    String strDate1 = sdfDate.format(dates1); 
    System.out.println("Date1: " + strDate1); 

} 
catch(ParseException e){ 
    e.printStackTrace(); 
} 

Wyjście to będzie:

Date1: 14/12/1940 
Powiązane problemy