tl; dr
LocalDateTime ldt = LocalDateTime.parse( "2012-01-10 23:13:26".replace( " " , "T" ) );
… и…
LocalDate localDate = LocalDate.parse ( "January 13, 2012" , DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US ) );
Подробности
Ответ от Jonik в основном правильный, но пропускает некоторыеважные вопросы.
java.time
Если есть что-то лучше, чем Йода, пожалуйста, дайте мне знать об этом.
ДаЕсть кое-что получше, фреймворк java.time .Команда Joda-Time рекомендует перейти на java.time в качестве преемника.
Инфраструктура java.time встроена в Java 8 и более поздние версии.Эти классы вытесняют старые проблемные классы даты и времени, такие как java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
.
Чтобы узнать больше, см. Oracle Tutorial .И найдите в Stack Overflow множество примеров и объяснений.
Большая часть функциональности java.time перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP .
Дата-время
Ваш первый ввод - это дата плюс время суток.В нем отсутствует какая-либо смещение от UTC или информация о часовом поясе , поэтому мы анализируем ее как объект LocalDateTime
.«Местный…» означает любой населенный пункт, без определенного населенного пункта.Так что это не фактический момент времени, а скорее грубая идея о моменте.
Для анализа входной строки 2012-01-10 23:13:26
мы можем заменить ПРОБЕЛ в середине на T
, чтобы соответствовать каноническому стилю для ISO 8601 стандартного формата значений даты и времени,
Классы java.time по умолчанию используют форматы ISO 8601 при анализе и генерации текстовых представлений значений даты и времени.Поэтому нет необходимости определять шаблон разбора.
String input = "2012-01-10 23:13:26".replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( input );
Если вы знаете предполагаемый часовой пояс из контекста этого значения, примените его для определения фактического момента на временной шкале.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
Дамп на консоль.
System.out.println ( "input: " + input + " | zdt: " + zdt );
Ввод: 2012-01-10T23: 13: 26 |zdt: 2012-01-10T23: 13: 26-05: 00 [Америка / Монреаль]
Только дата
Второй из вводимых вами данных - это значение только для даты безвремя суток и без часового пояса.Для этого нам нужен класс LocalDate
.
Я признаю формат этого ввода как соответствующий языковым (английским) и культурным нормам Соединенных Штатов.Поэтому нет необходимости явно указывать шаблон форматирования.Мы можем просто запросить форматировщик, который знает этот формат США, указав Locale
.Мы указываем FormatStyle.LONG
в зависимости от длины этого формата.
String input = "January 13, 2012";
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US );
LocalDate localDate = LocalDate.parse ( input , formatter );
Дамп на консоль.
System.out.println ( "input: " + input + " | localDate: " + localDate );
ввод: 13 января,2012 |localDate: 2012-01-13