Получение неправильных данных при использовании SimpleDateFormat.parse()

Я получаю странную ошибку при попытке проанализировать строку как календарь. Кажется, что это портит объект Date, который я использую для установки времени календаря результатов. Ошибка довольно противоречивая (или я не вижу в ней логики). Может ли кто-нибудь указать, что я могу делать неправильно?

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;
}

}

Результат:

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

person Tegi    schedule 22.03.2012    source источник


Ответы (2)


Вы используете YYYY в своем спецификаторе формата, который равен году недели (начиная с Java 7, я полагаю). Вам нужно yyyy, что означает просто «год». (См. SimpleDateFormat документацию.)

Я подозреваю, что остальная часть даты отсутствовала, потому что вы пытались также указать месяц и день, которые на самом деле не являются «особенностями» в недельном году... если бы вы указали «неделю недели года» и день неделю, это могло бы дать более разумные результаты, но только если вы действительно имели в виду использование недельных лет, в чем я сомневаюсь :)

person Jon Skeet    schedule 22.03.2012
comment
Оба ответа были очень полезными, этот проливает больше света на основную проблему. Я проверял неправильную документацию. - person Tegi; 23.03.2012
comment
вы только что спасли меня от нескольких часов бесплодных поисков в интернете! благодарю вас - person KoW; 13.11.2013
comment
В чем именно разница между годом и годом недели? Документация по этому различию немного скудна (как и документация по календарю). - person tytk; 23.07.2015
comment
@tytk: Год — это обычный год, где год разбит на год/месяц/день. Неделя-год — это более ориентированный на неделю-год способ разбивки, где каждая дата представлена ​​​​как неделя-год, неделя недели-года, день недели. - person Jon Skeet; 24.07.2015

Использовать это:

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

Это нижний регистр y для года, а не верхний регистр Y. При этом результат:

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

Глянь сюда:

person icyrock.com    schedule 22.03.2012