У меня есть дата в таком формате: 2027-02-14T14:20:00.000
Я хотел бы взять из него часы и минуты, как в этом случае: 14:20
Я пытался сделать что-то вроде этого:
val firstDate = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US).parse("2027-02-14T14:20:00.000")
val firstTime = SimpleDateFormat("H:mm").format(firstDate)
но у меня вылет java.text.ParseException: Unparseable date
Как взять часы и минуты из этой строки?
в дополнение к тому, что деХаар сказал о несоответствии вашего шаблона, я не совсем уверен, что вам вообще нужно делать синтаксический анализ здесь, вы можете просто избежать некоторых манипуляций со строками, судя по всему, то, что вы хотите, всегда сидит после T
и до второго :
как обрабатывать T в моем шаблоне?
Добавление T
, заключенного в одинарные кавычки, может сработать (но я не уверен в этом, когда дело доходит до SimpleDateFormat
. java.time
имеет встроенные средства форматирования, которые автоматически обрабатывают String
, отформатированные как ваш пример (формат ISO).
Я настоятельно рекомендую вам не использовать SimpleDateFormat
и Date
. Эти классы плохо спроектированы и давно устарели, а первые, как известно, доставляют много хлопот. Вместо этого используйте LocalDateTime
и DateTimeFormatter
, оба из java.time, современный API даты и времени Java.
Если вы можете использовать java.time
, вот пример с комментариями:
import java.time.LocalDateTime
import java.time.LocalDate
import java.time.format.DateTimeFormatter
fun main() {
// example String
val input = "2027-02-14T14:20:00.000"
// directly parse it to a LocalDateTime
val localDateTime = LocalDateTime.parse(input)
// print the (intermediate!) result
println(localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME))
// then extract the date part
val localDate = localDateTime.toLocalDate()
// print that
println(localDate)
}
Это выводит 2 значения: проанализированное промежуточное LocalDateTime
и извлеченное LocalDate
(последнее просто неявно вызывает свой метод toString()
):
2027-02-14T14:20:00
2027-02-14
По-прежнему используйте устаревший API (может быть необходимо, когда речь идет о большом количестве устаревшего кода, который, я сомневаюсь, вы найдете написанным на Kotlin):
import java.text.SimpleDateFormat
fun main() {
val firstDate = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")
.parse("2027-02-14T14:20:00.000")
val firstTime = SimpleDateFormat("yyyy-MM-dd").format(firstDate)
println(firstTime)
}
Выход:
2027-02-14
Где в вашем шаблоне
'T'
, а где доли секунд? Все они находятся вString
, который вы пытаетесь разобрать... Кстати, вам обязательно использовать такой старый/устаревший API? Почему неjava.time
илиkotlinx.datetime
?