Получение неправильных данных при использовании SimpleDateFormat.parse () - PullRequest
10 голосов
/ 23 марта 2012

Я получаю странную ошибку при попытке проанализировать строку как календарь. Кажется, что он портит объект 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

Ответы [ 2 ]

18 голосов
/ 23 марта 2012

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

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

3 голосов
/ 23 марта 2012

Используйте это:

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

Смотрите здесь:

...