2012-03-22 14 views
10

Viene visualizzato l'errore più strano quando si tenta di analizzare una stringa come calendario. Sembra che danneggi l'oggetto Date che utilizzo per impostare l'ora del calendario dei risultati. L'errore è abbastanza incoerente (o non vedo alcuna logica in esso). Qualcuno può far notare cosa potrei fare di sbagliato?Ottenere dati errati quando si utilizza SimpleDateFormat.parse()

public class caltest{ 
public static final SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.SSS"); 

public static void main(String[] args) { 
    String date1 = "1992-03-11 12:00:12.123"; 
    String date2 = "1993-03-11 12:00:12.123"; 
    String date3 = "1994-03-11 12:00:12.123"; 
    String date4 = "1995-03-11 12:00:12.123"; 
    parseStringAsCalendar(date1); 
    parseStringAsCalendar(date2); 
    parseStringAsCalendar(date3); 
    parseStringAsCalendar(date4); 
} 
public static String calendarToString(Calendar cal) { 
    return sdf.format(cal.getTime()); 
} 

public static Calendar parseStringAsCalendar(String s) { 
    Date time = null; 
    try { 
     time = sdf.parse(s); 
    } catch (ParseException e) { 
     System.out.println("Exception"); 
     e.printStackTrace(); 
    } 
    System.out.println(time.toString()); 
    GregorianCalendar ret = new GregorianCalendar(); 
    ret.setTime(time); 

    return ret; 
} 

}

L'output è:

Sun Dec 29 12:00:12 CET 1991 
Sun Dec 27 12:00:12 CET 1992 
Sun Dec 26 12:00:12 CET 1993 
Sun Jan 01 12:00:12 CET 1995 

risposta

18

Stai usando YYYY nel vostro di formato, che è settimana Anno (come di Java 7, credo). Si desidera yyyy, che è solo "anno". (Vedere SimpleDateFormat documentation.)

Sospetto che il resto della data fosse fuori perché si è tentato di specificare anche il mese e il giorno, che non sono realmente "caratteristiche" nell'anno della settimana ... se si specificava la "settimana della settimana dell'anno" e giorno della settimana, potrebbe aver dato alcuni risultati più sensibili, ma solo se si ha realmente dire usare settimana anni, di cui dubito :)

+0

Entrambe le risposte erano molto utile, questo brilla più di una luce sul problema sottostante. Stavo controllando la documentazione sbagliata. – Tegi

+3

mi hai appena salvato da parecchie ore di ricerca infruttuosa su internet! grazie – KoW

+0

Qual è esattamente la differenza tra * anno * e * anno settimana *? La documentazione è un po 'scarna su questa distinzione (come la documentazione per Calendar). – tytk

3

utilizzare questa:

public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 

È in minuscolo per anno, non in maiuscolo Y. Con questo, il risultato è:

Wed Mar 11 12:00:12 EST 1992 
Thu Mar 11 12:00:12 EST 1993 
Fri Mar 11 12:00:12 EST 1994 
Sat Mar 11 12:00:12 EST 1995 

Vedi qui:

Problemi correlati