2012-04-08 2 views
4

Я пытаюсь преобразовать String to Date.SimpleDateFormat - Непревзойденная дата

Вот мой код:

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); 
    Date date = format.parse("Sun Apr 08 16:37:00 CEST 2012"); 

я получаю исключение:

04-08 13: 51: 36,536: W/System.err (8005): java.text.ParseException: Непревзойденная дата: «Вс Апр 08 16:37:00 CEST 2012».

Формат, кажется, в порядке. Я что-то упускаю?

Спасибо.

+1

Да. Второй 'd' –

+0

Спасибо, но все же выдает то же исключение. – Domiik

+0

Нет, это не так. Попробуйте перекомпилировать свой код после внесения изменений. (Если у вас нет какой-то странной проблемы с локалью) –

ответ

-1

Похоже, что «Солнце» не распознается. Попробуйте это:

date = format.parse("Sunday Apr 08 16:37:00 CEST 2012"); 

работает для меня.

+1

В соответствии с http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html не имеет значения, является ли это аббревиатурой (Солнце) или полным словом (воскресенье). – Rob

7

Либо код, который вы отправили, не ваш фактический код, либо проблема с локалью. Он отлично работает на Sun Oracle Java 1.6 с американским языковым стандартом.

Изменить код:

SimpleDateFormat format = 
    new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US); 
+2

+1 Нужно ли упоминать Солнце? ;) –

+1

Хех - см. Мою заметку по редактированию. Я действительно должен был вернуться и изменить его ... Я никогда не буду привыкать к «Oracle Java», –

5

SimpleDateFormatLocale является специфичны. По крайней мере, шаблон E и M локали конкретным, так как, например, «Sun» или «воскресенье» не будет соответствовать для Locale.GERMAN или Locale.FRENCH и т.д. Вы лучше указать используемый Locale

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US); 

или использовать формат, который не является специфичным для локали.

2

Остальные ответы были прекрасные ответы в 2012 году Вот пример того, как делать с современными (2014) Java дата и время занятий:

пример
System.out.println("date de la requete est " + dateq); 
    DateTimeFormatter dtf = DateTimeFormatter 
      .ofPattern("EEE MMM dd HH:mm:ss xx uuuu", Locale.ROOT); 
    OffsetDateTime dateTime1 = OffsetDateTime.parse(dateq, dtf); 

    System.out.println("new date " + dateTime1); 

Код был вдохновлен дубликата вопрос (как Я это вижу), How to convert Xml String date to int in java. В примере, строки из этого вопроса он печатает:

date de la requete est Tue Feb 08 12:30:27 +0000 2011 
new date 2011-02-08T12:30:27Z 

Q: (?) Я не могу использовать новые классы на Android

A: Да, вы можете. Для Android используйте backport, специально предназначенный для Android, ThreeTenABP. В противном случае для Java 6 и 7 используйте ThreeTen Backport.

Вопрос: Ваш код не работает для строки даты в этот вопрос!

A: (1) Если вы можете, избегайте аббревиатур с часовыми поясами из трех и четырех букв, таких как CEST. Многие из них неоднозначны, и интерпретация может даже варьироваться в зависимости от настройки текущего часового пояса JVM. CEST - это только летняя половина часового пояса, а не полный часовой пояс. (2) Если вы не можете получить строку без CEST или аналогичной в ней, попробуйте использовать ZonedDateTime вместо OffsetDateTime и используйте zzz в шаблоне формата, как в вопросе. Это работает в примере и производит 2012-04-08T16:37+02:00[Europe/Paris].

В: Как использовать новые классы?

A: Хорошее место для начала - Oracle Tutorial.

Вопрос: Locale.ROOT ??

A: Если ваша строка даты и времени исходит из определенного места в мире и на языке этого места, конечно, используйте соответствующий язык. Если это просто на английском языке, потому что компьютерные системы повсюду имеют тенденцию выводить английский, я предпочитаю использовать Locale.ROOT для «локали нейтральной локали», например, говоря «не делайте ничего локального здесь».

Смежные вопросы