Как конвертировать в строку с помощью DateTimeFormatter - PullRequest
0 голосов
/ 20 сентября 2019

Теперь у меня в моей дате в БД: Long:

val time = target?.date ?: 0L

И я конвертирую ее в Date:

val date = Date(time)

И после этого используйте в качестве String для отображения моей даты:

val format = SimpleDateFormat("d MMMM, yyyy")
format.format(date)

Все работает правильно

Но теперь я хочу сделать то же самое, просто используя DateTimeFormatter Возможно ли это?

Ответы [ 4 ]

0 голосов
/ 20 сентября 2019

Как упомянуто @edric, мы можем использовать LocalDate для форматирования DateTimeFormatter ,

Для преобразования длинных (бывших миллисекунд) в LocalDate мы можем использовать несколько способов.

val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy MM dd")
  1. Первый путь (Ссылка: java.time.LocalDate # now (java.time.Clock) или org.threeten.bp.LocalDate # now (java.time.Clock))

    LocalDate.ofEpochDay(Math.floorDiv(time, 24 * 60 * 60 * 1000)).format(dateTimeFormatter)

2-й и 3-й способ, которым мы можем использовать Calendar

2.

    var time = target?.date ?: 0L

    var calendar = Calendar.getInstance()
    calendar.timeInMillis = time

    LocalDate.of(calendar.get(Calendar.YEAR),
        calendar.get(Calendar.MONTH) + 1,
        calendar.get(Calendar.DAY_OF_MONTH)
    ).format(dateTimeFormatter)

3

    var time = target?.date ?: 0L

    var calendar = Calendar.getInstance()
    calendar.timeInMillis = time

    LocalDate.ofYearDay(calendar.get(Calendar.YEAR), calendar.get(Calendar.DAY_OF_YEAR)).format(dateTimeFormatter)
0 голосов
/ 20 сентября 2019

Вы должны проверить документы для DateTimeFormatter класса , прежде чем читать дальше.В любом случае, вы можете использовать классы LocalDate и DateTimeFormatter.

Глядя на документацию LocalDate class , я вижу, что есть способ разрешить указание long с помощью LocalDate#ofEpochDay метод.

В любом случае, в документации класса DateTimeFormatter есть пример кода, который я здесь скопирую дословно, но адаптированный для использования метода LocalDate#ofEpochDay:

val date = LocalDate.ofEpochDay(target?.date ?: 0L)
val formatter = DateTimeFormatter.ofPattern("d MMMM, yyyy")
val format = date.format(formatter)

Кроме того, я сократил количество кода, необходимого для решения вашей проблемы.

Надеюсь, это поможет!(PS Мне еще предстоит протестировать приведенный выше пример кода.)

0 голосов
/ 20 сентября 2019

Вы должны преобразовать свой Date объект в LocalDate, и оттуда он прост.Вот рабочий пример использования Kotlin Playground

fun formatMillisUsingDateTimeFormatter(millis: Long): String {
    val date = Date(millis).toInstant().atZone(ZoneId.systemDefault()).toLocalDate()

    val formatter = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.getDefault())

    return date.format(formatter)
}

A LocalDate объект имеет формат # , который получает непосредственно DateTimeFormatter для преобразования себя вСтрока.Теперь, чтобы преобразовать Date объект в LocalDate объект, он включает несколько преобразований, и я бы рекомендовал против него, однако вам нужно преобразовать его в Instant , затем ZonedDateTime и, наконец, LocalDate .

0 голосов
/ 20 сентября 2019

Попробуйте сделать это так:

val shortFormat : DateTimeFormatter =
    DateTimeFormat.forPattern("MM/dd/yy").withZone(PST)
val formatted : String = shortFormat.print(time)
...