tl; dr
Используйте современные java.time классы, никогда не ужасные унаследованные классы.
Вот синтаксис Java (я еще не изучил Kotlin).
LocalDateTime // Represent a date with time-of-day but lacking offset-from-UTC or time zone. As such, this does *not* represent a moment, is *not* a point on the timeline.
.parse( "2018-04-13T20:00:00.0400" ) // Parse an input string in standard ISO 8601 format. Returns a `LocalDateTime` object.
.toLocalDate() // Extract the date-only portion without the time-of-day. Still no time zone or offset-from-UTC. Returns a `LocalDate` object.
.format( // Generate text representing the value of that `LocalDate` object.
DateTimeFormatter // Define a pattern to use in generating text.
.ofLocalizedDate( FormatStyle.LONG ) // Automatically localize, specifying how long/abbreviated…
.withLocale( Locale.US ) // … and what human language and cultural norms to use in localizing.
) // Return a `String`.
13 апреля 2018
Для более ранних версий Android см. Маркеры внизу ниже.
Использование java.time
преобразовать строку DateTime, например "2018-04-13T20: 00: 00.0400", в "13 апреля 2018".
Вы используете ужасную старую дату-классы времени, которые были вытеснены годами назад классами java.time .
Сначала проанализируйте входную строку.Но что это за .0400
на конце?Возможно, доли секунды?Но обычно миллисекунды, микросекунды или наносекунды отображаются группами по 3 цифры.Так что ваши четыре цифры здесь странные.Возможно смещение от UTC?Для этого подходят четыре цифры: часы и минуты с нулем в начале.Но нет знака плюс или минус , чтобы указать впереди или позади UTC.Так что я пойду с долей секунды.
В вашем входе отсутствует индикатор смещения от UTC или часового пояса.Так что разбери как LocalDateTime
.Ваша строка в стандартном формате ISO 8601.Стандартные форматы по умолчанию используются в классах java.time .
String input = "2018-04-13T20:00:00.0400";
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString (): 2018-04-13T20: 00: 00.040
Извлечение части даты.
LocalDate ld = ldt.toLocalDate() :
ld.toString (): 2018-04-13
Создание текста, представляющего значение этой даты.Пусть java.time автоматически локализуется.Для локализации укажите:
FormatStyle
, чтобы определить, как долго или сокращенно должна быть строка. Locale
доопределить: - человеческий язык для перевода названия дня, названия месяца и т. д.
- культурных норм решения вопросов сокращения, заглавные буквы, пунктуация, разделители и т. п.
Код:
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.LONG ).withLocale( Locale.US );
String output = ld.format( f );
13 апреля 2018
Осторожно: A LocalDateTime
объект - не момент, не точка на временной шкале.Отсутствие какого-либо смещения от UTC или часового пояса означает, что оно представляет диапазон потенциальных моментов в диапазоне около 26-27 часов (текущий диапазон часовых поясов по всему миру).Если входная строка неявно предназначалась для представления момента времени настенного времени некоторого региона, вы должны применить ZoneId
, чтобы получить объект ZonedDateTime
, прежде чем извлекать LocalDate
.Это было показано много раз ранее при переполнении стека.
О java.time
java.time Framework встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .