java.time
Вы используете старые проблемные классы даты и времени, которые теперь вытесняются классами java.time.
Фреймворк java.time встроен вЯва 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
в середине, а не в пробеле.Таким образом, один из вариантов - заменить пробел на 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