ТЛ; др
LocalDate.parse( "2015-01-02" )
java.time
Java 8 и более поздние версии имеют новую структуру java.time , которая делает эти ответы устаревшими. Этот фреймворк вдохновлен Joda-Time , определенным JSR 310 и расширенным проектом ThreeTen-Extra . См. Учебник .
Старые связанные классы, java.util.Date/.Calendar, общеизвестно хлопотны и запутаны. Избегайте их.
LocalDate
Как и Joda-Time, java.time имеет класс LocalDate
для представления значения только для даты без времени суток и без часового пояса.
ISO 8601
Если ваша входная строка имеет стандартный ISO 8601 формат yyyy-MM-dd
, вы можете попросить этот класс непосредственно проанализировать строку без необходимости указывать форматер.
Форматы ISO 8601 по умолчанию используются в java.time как для синтаксического анализа, так и для генерации строковых представлений значений даты и времени.
LocalDate localDate = LocalDate.parse( "2015-01-02" );
Formatter
Если у вас другой формат, укажите форматер из пакета java.time.format . Вы можете указать свой собственный шаблон форматирования или позволить java.time автоматически локализовать в соответствии с Locale
, указав человеческий язык для перевода и культурные нормы для решения таких вопросов, как точка против запятой.
Шаблон форматирования
Прочитайте документацию класса DateTimeFormatter
для получения подробной информации о кодах, используемых в шаблоне формата. Они немного отличаются от старых устаревших java.text.SimpleDateFormat
шаблонов классов.
Обратите внимание, что вторым аргументом метода parse
является ссылка на метод , синтаксис добавлен в Java 8 и более поздние версии.
String input = "January 2, 2015";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MMMM d, yyyy" , Locale.US );
LocalDate localDate = LocalDate.parse ( input , formatter );
Дамп на консоль.
System.out.println ( "localDate: " + localDate );
localDate: 2015-01-02
Локализация автоматически
Или вместо указания шаблона форматирования, пусть java.time локализуется для вас. Позвоните по номеру DateTimeFormatter.ofLocalizedDate
и обязательно укажите желаемое / ожидаемое Locale
, а не полагайтесь на текущее значение по умолчанию JVM, которое может измениться в любой момент во время выполнения (!).
String input = "January 2, 2015";
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG );
formatter = formatter.withLocale ( Locale.US );
LocalDate localDate = LocalDate.parse ( input , formatter );
Дамп на консоль.
System.out.println ( "input: " + input + " | localDate: " + localDate );
ввод: 2 января 2015 г. | localDate: 2015-01-02