Я пытаюсь проанализировать дату, но странным образом получаю исключение.
Это код:
import java.util.Date;
StringstrDate="Wed, 09 Feb 2011 12:34:27"; Date date; SimpleDateFormatFORMATTER=newSimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss"); try { date = FORMATTER.parse(strDate.trim()); System.out.println(date); } catch (ParseException e) { e.printStackTrace(); }
Исключение составляет:
Исключение java.text.ParseException: неразрешимая дата: "Ср., 09 февраля 2011 г. 12:34:27" в java.text.DateFormat.parse(DateFormat.java:337) в DateTest.main(DateTest.java:17)
Я прочитал документацию и думаю, что мой шаблон правильный. Поэтому я не понимаю...
Есть идеи?
Спасибо!
Переведено автоматически
Ответ 1
Вероятно, это из-за того, что язык по умолчанию на вашем компьютере не английский.
В вопросе и другом ответе используются устаревшие, вызывающие проблемы старые классы даты и времени, которые теперь являются устаревшими, вытесненными классами java.time .
Использование java.time
Во входной строке отсутствуют какие-либо указания часового пояса или смещения от UTC. Поэтому мы анализируем как OffsetDateTime.
Укажите a Locale, чтобы определить (а) человеческий язык для перевода названия дня, названия месяца и тому подобного, и (б) культурные нормы, решающие вопросы аббревиатур, заглавных букв, знаков препинания, разделителей и тому подобного.
Stringinput="Wed, 09 Feb 2011 12:34:27" ; Localel= Locale.US ; DateTimeFormatterf= DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss" , l ) ; LocalDateTimeldt= LocalDateTime.parse( input , f ) ;
ldt.toString(): 2011-02-09T12:34:27
Часовой пояс
И Вопрос, и другой ответ игнорируют важную проблему часового пояса.
Во входной строке отсутствует часовой пояс или смещение. Мы проанализировали как, LocalDateTime который не является моментом на временной шкале, только смутное представление о возможных моментах. Подобно высказыванию "Рождество начинается в полночь 25 декабря 2017 года", это не имеет смысла, пока вы не разместите его в контексте определенного часового пояса. Рождество в Окленде, Новая Зеландия, наступает намного раньше, чем в Париже, Франция, и еще намного позже в Монреале, Квебек.
Если вы знаете предполагаемый часовой пояс, назначьте ZoneId для получения ZonedDateTime.
ZoneIdz= ZoneId.of( "America/Montreal" ) ; ZonedDateTimezdt= ldt.atZone( z ); // Assigning a time zone to determine an actual moment on the timeline.
Преобразование
Лучше избегать проблемных старых устаревших классов даты и времени. Но если вам необходимо взаимодействовать со старым кодом, еще не обновленным до типов java.time, вы можете выполнить преобразование между устаревшими классами и java.time. Ищите новые методы, добавляемые к старым классам.
A java.util.Date - это момент на временной шкале по UTC. Итак, нам нужно извлечь Instant из нашего ZonedDateTime. Instant Класс представляет момент на временной шкале в UTC с разрешением в наносекунды (до девяти (9) знаков десятичной дроби).
Instantinstant= zdt.toInstant() ; java.util.Dated= java.util.Date.from( instant ) ; // Convert from java.time to legacy class.
Идем в другом направлении.
Instantinstant= d.toInstant() ; // Convert from legacy class to java.time class. ZonedDateTimezdt= instant.atZone( z ) ; // Adjust from UTC into a particular time zone.
Чтобы узнать больше, ознакомьтесь с Руководством по Oracle. И найдите в Stack Overflow множество примеров и пояснений. Спецификация - JSR 310.
Вы можете обмениваться объектами java.time непосредственно со своей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательным полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и больше.
Ответ 3
Никогда не используйте SimpleDateFormat или DateTimeFormatter без Locale
Поскольку данная дата и время указаны на английском языке, вы должны использовать Locale.ENGLISH с вашим анализатором даты и времени; в противном случае произойдет сбой синтаксического анализа в системе (компьютере, телефоне и т.д.), которая использует неанглоязычный тип локали.
Также обратите внимание, что API даты и времени java.util и их API форматирования, SimpleDateFormat устарели и подвержены ошибкам. Рекомендуется полностью прекратить их использование и переключиться на современный API для определения даты и времени.
По какой-либо причине, если вам нужно придерживаться Java 6 или Java 7, вы можете использовать ThreeTen-Backport, который переносит большую часть функций java.time в Java 6 и 7.
System.out.println("JVM's Locale: " + Locale.getDefault()); // Using DateTimeFormatter with the default Locale dtfWithDefaultLocale = DateTimeFormatter.ofPattern("EEE, dd MMM uuuu HH:mm:ss"); System.out.println("DateTimeFormatter's Locale: " + dtfWithDefaultLocale.getLocale()); System.out .println("Parsed with JVM's default locale: " + LocalDateTime.parse(strDateTime, dtfWithDefaultLocale)); } }
Вывод:
JVM's Locale: en_GB DateTimeFormatter's Locale: en_GB Parsed with JVM's default locale: 2011-02-09T12:34:27 JVM's Locale: fr_FR DateTimeFormatter's Locale: en Parsed with Locale.ENGLISH: 2011-02-09T12:34:27 JVM's Locale: fr_FR DateTimeFormatter's Locale: fr_FR Exception in thread "main" java.time.format.DateTimeParseException: Text 'Wed, 09 Feb 201112:34:27' could not be parsed at index 0 at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046) at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948) at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492) at Main.main(Main.java:33)
Следующая демонстрация с использованием SimpleDateFormat приведена просто для полноты картины: