Ответ 1
Возможно, это из-за языкового стандарта по умолчанию на вашем компьютере, который не является английским.
Вы должны использовать:
new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.ENGLISH);
вместо.
Я пытаюсь разобрать дату, но я странно получаю исключение.
Это код:
import java.util.Date;
String strDate = "Wed, 09 Feb 2011 12:34:27";
Date date;
SimpleDateFormat FORMATTER = new SimpleDateFormat("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" at java.text.DateFormat.parse(DateFormat.java:337) на DateTest.main(DateTest.java:17)
Я прочитал документацию , и я думаю, что мой шаблон верен. Поэтому я не понимаю...
Любая идея?
Спасибо!
Возможно, это из-за языкового стандарта по умолчанию на вашем компьютере, который не является английским.
Вы должны использовать:
new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.ENGLISH);
вместо.
java.util.Date.from (
LocalDateTime.parse(
"Wed, 09 Feb 2011 12:34:27" ,
DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss" , Locale.US )
).atZone( ZoneId.of( "America/Montreal" ) )
.toInstant()
)
В вопросе и в другом ответе используются устаревшие неприятные старые классы времени, которые теперь являются устаревшими, вытесняются классами java.time.
В строке ввода отсутствуют какие-либо указания о часовом поясе или смещении от-UTC. Поэтому мы анализируем как OffsetDateTime
.
Укажите Locale
чтобы определить (а) человеческий язык для перевода имени дня, названия месяца и т.д. И (б) культурных норм, определяющих вопросы сокращения, капитализации, пунктуации, разделителей и т.д.
String input = "Wed, 09 Feb 2011 12:34:27" ;
Locale l = Locale.US ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss" , l ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
ldt.toString(): 2011-02-09T12: 34: 27
И вопрос, и другой ответ игнорируют решающую проблему часового пояса.
В строке ввода отсутствует часовой пояс или смещение. Мы анализировали как LocalDateTime
который не является моментом на временной шкале, а лишь смутное представление о возможных моментах. Например, "Рождество начинается в полночь 25 декабря 2017 года", это не имеет значения, пока вы не разместите его в контексте определенного часового пояса. Рождество происходит гораздо раньше в Окленде Новая Зеландия, чем в Париже во Франции, а еще много еще в Монреале Квебеке.
Если вы знаете предполагаемый часовой пояс, назначьте ZoneId
для создания ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ldt.atZone( z ); // Assigning a time zone to determine an actual moment on the timeline.
Лучше избегать неприятных старых устаревших классов времени. Но если вы должны взаимодействовать со старым кодом, который еще не обновлен до типов java.time, вы можете преобразовать между устаревшими классами и java.time. Посмотрите, как новые методы добавляют к старым классам.
java.util.Date
- момент на временной шкале в UTC. Поэтому нам нужно извлечь Instant
из нашего ZonedDateTime
. Instant
класс представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Instant instant = zdt.toInstant() ;
java.util.Date d = java.util.Date.from( instant ) ; // Convert from java.time to legacy class.
Иду в другую сторону.
Instant instant = d.toInstant() ; // Convert from legacy class to java.time class.
ZonedDateTime zdt = instant.atZone( z ) ; // Adjust from UTC into a particular time zone.
Рамка java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь в режиме обслуживания, советует перейти на классы java.time.
Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация - JSR 310.
Вы можете обменивать объекты java.time непосредственно с вашей базой данных. Используйте JDBC-драйвер, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*
.
Где можно получить классы java.time?
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.