#java #android #date #kotlin #calendar
Вопрос:
Эй, у меня есть ответ json от retrofit. Я хочу отфильтровать соответственно свойству sentAt. Я хочу сравнить последнее время и переместить блок соответственно этому. Прямо сейчас в моем json есть 4 элемента/блока, но их может быть больше. Может ли кто-нибудь знать, как эффективно фильтровать список и изменять его? Также мне нужно преобразовать значение sentAt в формат времени и даты и сохранить в другой переменной. Формат сегодняшней даты будет соответствовать времени, и если дата старая, мне нужен формат даты.
Ответ Json
{
"conversations": [
{
"id": "789",
"title": "Conversation Title 3",
"lastMessage": {
"id": "4677",
"text": "Text 3",
"sentAt": "2021-09-28T10:39:10.0492422 01:00"
}
},
{
"id": "456",
"title": "Conversation Title 2",
"lastMessage": {
"id": "3c7e",
"text": "Text2",
"sentAt": "2021-09-26T12:39:10.0493518 01:00"
}
},
{
"id": "101",
"title": "Conversation Title 4",
"lastMessage": {
"id": "f983",
"text": "Text 4",
"sentAt": "2021-09-30T13:39:10.0493537 01:00"
}
},
{
"id": "123",
"title": "Conversation Title 1",
"lastMessage": {
"id": "f983",
"text": "Text 1",
"sentAt": "2021-09-26T12:38:00.0493537 01:00"
}
}......
]
}
ожидаемый результат
{
"conversations": [
{
"id": "101",
"title": "Conversation Title 4",
"lastMessage": {
"id": "f983",
"text": "Text 4",
"sentAt": "2021-09-30T13:39:10.0493537 01:00"
}
},
{
"id": "789",
"title": "Conversation Title 3",
"lastMessage": {
"id": "4677",
"text": "Text 3",
"sentAt": "2021-09-28T10:39:10.0492422 01:00"
}
},
{
"id": "456",
"title": "Conversation Title 2",
"lastMessage": {
"id": "3c7e",
"text": "Text2",
"sentAt": "2021-09-26T12:39:10.0493518 01:00"
}
},
{
"id": "123",
"title": "Conversation Title 1",
"lastMessage": {
"id": "f983",
"text": "Text 1",
"sentAt": "2021-09-26T12:38:00.0493537 01:00"
}
}......
]
}
Например, для хранения значения в переменной
id : 101
time : 13:39
id : 789
time : 28/09/2021
Добавлен класс данных
Разговоры отвечают
data class ConversationsResponse(
val conversations: List<Conversations>? = null
)
Разговоры
data class Conversations(
val id: String? = null,
val title: String? = null,
val lastMessage: LastMessage? = null
)
Последнее сообщение
data class LastMessage(
val id: String? = null,
val text: String? = null,
val sentAt: String? = null
)
Комментарии:
1. Как вы обрабатываете этот ответ на Java? Используете ли вы Gson, Jackson или любую другую библиотеку или анализируете ее вручную ? Я бы сохранил полную дату, время и смещение с помощью a
java.time.OffsetDateTime
, потому что на самом деле он состоит из aLocalDate
, aLocalTime
и aZoneOffset
, и все они доступны отдельно.2. @deHaar Я использую библиотеку моши для анализа ответа json. И как отфильтровать ответ json ?
3. Хорошо, не могли бы вы показать нам класс(ы), который вы используете для этого?
4. @deHaar ты имеешь в виду класс данных ?
5. Да, класс данных (Котлин) или Pojo (Java)
Ответ №1:
Вот пример для анализа входного времени и обработки частей даты и времени отдельно, для которого я взял один из sentAt
s из вашего образца JSON:
import java.time.LocalDate
import java.time.LocalTime
import java.time.OffsetDateTime
import java.time.format.DateTimeFormatter
fun main() {
// example input from JSON
val sentAt = "2021-09-28T10:39:10.0492422 01:00"
// parse it directly, it is in ISO standard format
val odt: OffsetDateTime = OffsetDateTime.parse(sentAt)
// extract the date only
val date: LocalDate = odt.toLocalDate()
// extract the time of day
val time: LocalTime = odt.toLocalTime()
// format the date using a standard formatter
val dateString = date.format(DateTimeFormatter.ISO_LOCAL_DATE)
// and do the same for the time
val timeString = time.format(DateTimeFormatter.ISO_LOCAL_TIME)
// then print the formatted date and time separately
println("date: $dateString and time: $timeString")
}
Результатом этого является
date: 2021-09-28 and time: 10:39:10.0492422
Вы можете использовать это либо непосредственно в data class LastMessage
классе утилиты, либо создать какой-либо класс утилиты, который преобразует значения даты String
LastMessage
и времени в s.
Можно изменить выходные данные, используя разные DateTimeFormatter
s. Существует несколько встроенных модулей, и вы можете создать свой собственный форматер с помощью DateTimeFormatterBuilder
или DateTimeFormatter.ofPattern(String pattern)
. Вы можете передать a Locale
в a DateTimeFormatter
, если хотите управлять языком именованных единиц, таких как месяцы, дни недели.
Комментарии:
1. спасибо за вашу помощь. И то, что нужно отфильтровать ответ json, является моим первым приоритетом, а затем изменение sentAt-мой второй приоритет.
2.
OffsetDateTime
,LocalDate
иLocalTime
сопоставимы, вы можете сначала преобразоватьString
их в anOffsetDateTime
, а затем, возможно, отсортировать их. Эти объектыjava.time
удобны для фильтрации.3. я постараюсь их рассортировать
4. Очень хороший ответ! Стоит отметить, что современный API для определения даты и времени основан на стандарте ISO 8601 и не требует
DateTimeFormatter
явного использования объекта, если строка даты и времени соответствует стандартам ISO 8601.