java.time
Вы используете старые классы хлопотно даты и время в настоящее время вытеснены классами java.time.
Рамка java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют старые неприятные классы времени, такие как java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
. Команда Joda-Time также рекомендует перейти на java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений.
Большая часть функциональности java.time портирована на Java 6 & 7 в ThreeTen-Backport и далее адаптирована для Android в ThreeTenABP.
LocalDate
Для дат только значений, используйте LocalDate
класс. Ваше входное значение соответствует стандарту ISO 8601. Форматы ISO 8601 по умолчанию используются в классах java.time для синтаксического анализа и генерации строк, которые представляют значения даты и времени. Поэтому нет необходимости указывать шаблон форматирования.
LocalDate localDate = LocalDate.parse("2012-03-05");
Чтобы создать такую строку, позвоните по номеру toString
.
String output = localDate.toString();
LocalDateTime
Для строки, такие как 2012-03-05 12:34:56
у нас есть проблемы. Не отображается смещение-от-UTC или часовой пояс. Таким образом, это не представляет собой фактический момент на временной шкале, а скорее приблизительное представление о возможных моментах. Этот немомент представлен в java.time классом LocalDateTime
.
Формат вашей строки является вариантом ISO 8601, в то время как каноническая версия имеет T
в середине, а не в пространстве. Таким образом, одним из вариантов является замена SPACE на T
.
LocalDateTime ldt = LocalDateTime.parse("2012-03-05 12:34:56".replace(" " , "T");
Или определить шаблон.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
LocalDateTime ldt = LocalDateTime.parse("2012-03-05 12:34:56" , formatter);
Избегайте использования таких даты и времени форматы, отсутствующие в офсетной или информации часового пояса, если на самом деле они предназначены для представления реальных моментов на временной шкале.
ZonedDateTime
Чтобы дать, что значение значение, чтобы определить фактический момент на временной шкале, необходимо назначить временную зону, для которой предназначен дата-время.
ZoneId zoneId = ZoneId.of("America/Montreal");
ZonedDateTime zdt = ldt.atZone(zoneId);
Вызов toString
генерирует строку в формате, который расширяет стандартный формат ISO 8601 путем добавления имени временной зоны в квадратных скобках.
String output = zdt.toString(); // Yields: 2012-03-05T12:34:56-04:00[America/Montreal]
Если вы хотите, чтобы опустить T
можно заменить с помощью ПРОСТРАНСТВЕ String::replace
метода. Или используйте форматтер. Если вы действительно хотите строку, как видно из вопроса, не имеющего никакой информации о смете или часовом поясе (по моей рекомендации), используйте тот же форматтер, что и выше.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); // Not recommended as it lacks offset/zone info.
String output = zdt.format(formatter); // Yields: 2012-03-05 12:34:56
Какая ошибка вы получаете? Есть ли стек? Или в каком формате вы получаете дату? – TrueDub
'2012-03-05' должно быть "2012-03-05" – radimpe
Просьба показать исключение stacktrace (сгенерировано e.printStackTrace()) –