Невозможно проанализировать строку DateTime с маркером AM / PM - PullRequest
15 голосов
/ 01 сентября 2010

Строка, которую я хочу отформатировать, выглядит следующим образом: String datetime = "9/1/10 11:34:35 AM"

Работает следующий шаблон для SimpleDateFormat:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss");
Date d = sdf.parse(datetime);
System.out.println(d);

Output> [Wed Sep 01 11:34:35 CEST 2010]

Однако мне нужно также проанализировать маркер AM / PM, и когда я добавляю это в шаблон, я получаю исключение.

Шаблон, который не работает:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss a");

У меня естьпробовал с этим также с тем же исключением:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss aa");

Исключение:

java.text.ParseException: Unparseable date: "9/1/10 11:34:35 AM"

Я просмотрел API на http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#text, но, кажется, не могу найти, где я делаю неправильно.

Есть предложения?

Ответы [ 4 ]

31 голосов
/ 01 сентября 2010

Возможно, по умолчанию Locale имеет разные символы для AM / PM.При построении формата даты вы всегда должны указывать Locale, если вы действительно не хотите использовать системное значение по умолчанию Locale, например:

SimpleDateFormat sdf = new SimpleDateFormat("M/d/yy h:mm:ss a", Locale.US)
3 голосов
/ 27 ноября 2014

Я беру пример даты, приведенной ниже, и распечатываю отформатированную дату в 24-часовой формат, если это соответствует вашим требованиям.

 String inputdate="9/1/10 11:34:35 AM";
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd/MM/yy hh:mm:ss aa",Locale.getDefault());
        try {
            System.out.println(""+new SimpleDateFormat("dd/MM/yy HH:mm:ss",Locale.getDefault()).format(simpleDateFormat.parse(inputdate)));

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

Если у вас все еще есть вопрос, пожалуйста, ответьте. Спасибо.

1 голос
/ 16 июня 2017

Современный ответ:

    String datetime = "9/1/10 11:34:35 AM";
    LocalDateTime dt = LocalDateTime.parse(datetime, 
            DateTimeFormatter.ofPattern("M/d/yy h:mm:ss a", Locale.ENGLISH));

Это дает LocalDateTime 2010-09-01T11: 34: 35.Остерегайтесь двузначных лет, хотя;DateTimeFormatter примет 2000 до 2099. Для моего дня рождения это было бы неправильно.

Нам все еще нужно указать локаль.Поскольку маркеры AM / PM практически не используются на других языках, кроме английского, я счел Locale.ENGLISH довольно безопасной ставкой.Пожалуйста, замените свой собственный.

Другие ответы были хорошими в 2010 и 2011 годах. Уже в 2014 году вышеприведенное было в силе, и я бы предпочел его.

0 голосов
/ 28 октября 2011

Если вы работаете с FreeMarker for Java и попробуйте решить эту проблему, используйте приведенный ниже код.У меня была эта проблема, моя локаль установила AM / PM как DE.Не уверен, почему ... <#setting locale="en_US">

...