Строка даты в формате Jetpack Compose

Пожалуйста, как мне отформатировать эти строки даты: 2017-04-08T18:39:42Z или 2023-04-04T14:01:31-07:00, чтобы получить что-то вроде этого: August 04, 2017 | 6:39pm. Заранее спасибо. Я пробовал что-то вроде этого ниже:

@RequiresApi(Build.VERSION_CODES.O)
private fun formatDate(date: String): String {

    return try {
        val datePattern = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss", Locale.ENGLISH)
        val offSetDateTime = OffsetDateTime.parse(date, datePattern)
        val formattedDate = "${offSetDateTime.month} ${offSetDateTime.dayOfMonth}, ${offSetDateTime.year}"
        Log.i("formattedDate", formattedDate)
        formattedDate
    } catch (e: Exception) {
        date
    }
}

Это не работает. Он возвращает строку, переданную в качестве аргумента, в слове порядка, он генерирует исключение.

Просто бросьте datePattern. OffsetDateTime анализирует обе ваши строки без какого-либо явного средства форматирования, потому что они обе в формате ISO 8601: val offSetDateTime = OffsetDateTime.parse(date). Не забудьте преобразовать проанализированные дату и время в часовой пояс, который ожидает ваш пользователь, например: offsetDateTime.atZoneSameInstant(ZoneId.systemDefault()). Потому что ваш пользователь не может использовать August 04, 2017 | 6:39pm ни для чего, если он понимается по смещению UTC, которого они не знают. А затем используйте DateTimeFormatter для форматирования в нужную строку.

Ole V.V. 11.04.2023 07:20
2
1
298
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

OffsetDateTime.parse требуется строка, содержащая смещение (+/-hh:mm) Разберите его с помощью LocalDateTime.parse

    val dateSt = "2017-04-08T18:39:42Z"
    val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'")
    val formattedDate = LocalDateTime.parse(dateSt, dateFormatter)
    val res = DateTimeFormatter.ofPattern("MMMM dd, yyyy | hh:mma").format(formattedDate) // August 04, 2017 | 6:39pm

Спасибо @ахмед. Это сработало. Но знаете ли вы, как я могу это реализовать, если строка выглядит так: 2023-04-04T14:01:31-07:00?

Trailblazer 09.04.2023 17:29

@Trailblazer, который вы можете использовать DateTimeFormatter.ISO_OFFSET_DATE_TIME в качестве предопределенного средства форматирования, вы можете проверить эту страницу для получения дополнительных предопределенных средств форматирования docs.oracle.com/javase/8/docs/api/java/time/format/…

ahmed nader 09.04.2023 23:29

Спасибо за ваш ответ @ahmed. Это то, что я сделал позже. Работает.

Trailblazer 10.04.2023 00:26

Другие вопросы по теме