2012-03-22 9 views
10

Otrzymuję najdziwniejszy błąd, gdy próbuję analizować ciąg jako kalendarz. Wygląda na to, że przesłania on obiekt Date, którego używam do ustawienia czasu kalendarza wyników. Błąd jest dość niespójny (lub nie widzę w nim logiki). Czy ktoś może wskazać, co robię źle?Uzyskiwanie niepoprawnych danych podczas korzystania z 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; 
} 

}

Wyjście jest:

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 

Odpowiedz

18

Używasz YYYY w specyfikacją formatu, który jest tydzień roku (jak Java 7, wierzę). Chcesz yyyy, który jest po prostu "rokiem". (Zobacz SimpleDateFormat documentation.)

Podejrzewam, że pozostała część daty została usunięta, ponieważ próbowano również określić miesiąc i dzień, które nie są tak naprawdę "funkcjami" w roku kalendarzowym ... jeśli określono „tydzień roku week” i dzień tygodnia, to może dać jakieś bardziej sensowne wyniki, ale tylko jeśli naprawdę oznaczało używać tygodniu lata, w co wątpię :)

+0

Obie odpowiedzi były bardzo przydatne, to jeden z bardziej jaśnieje światło na podstawowy problem. Sprawdzałem złą dokumentację. – Tegi

+3

właśnie uratowałeś mnie od kilku godzin bezowocnych poszukiwań w Internecie! dziękuję – KoW

+0

Jaka jest dokładnie różnica między * rok * i * rok tygodniowy *? Dokumentacja jest nieco skąpa w tym rozróżnieniu (podobnie jak dokumentacja kalendarza). – tytk

3

użyj:

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

Jest to małe litery y na rok, bez wielkich liter Y. Z tym, wynik jest:

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 

Zobacz tutaj: