Как правильно получить вчерашний заказ в часовом поясе Африки/Алжира при использовании меток времени UTC в Котлине?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно получить вчерашний заказ в часовом поясе Африки/Алжира при использовании меток времени UTC в Котлине?

Сообщение Anonymous »

Мне нужна помощь в решении этой особой проблемы: мои пользователи находятся в Африке/Алжире. Идентификатор зоны здесь находится в Африке/Алжире. Когда мои пользователи размещают заказ, дата, конечно, сохраняется в формате UTC повсюду в базе данных, а не только дата размещения заказа. Теперь у меня есть метод, который получает два последних заказа (вчерашний заказ и сегодняшний заказ), проблема в том, что когда я пытаюсь получить вчерашний заказ, когда идентификатор зоны — Африка/Алжир, мой метод задает его как сегодняшний заказ. Это происходит, когда мой пользователь размещает заказ с 23:00 до 23:59 по всемирному координированному времени, потому что Африка/Алжир находится на 1 час позже UTC, и когда дата преобразуется обратно в часовой пояс пользователя (Африка/Алжир), он дает мне следующий день. Но заказ для них был сделан вчера и этот заказ должен быть возвращен как вчерашний заказ, а не сегодняшний заказ, как это делается сейчас. Это проблема, которую я хочу исправить, вот мой код:
Метод, в котором возникла проблема

Код: Выделить всё

fun getRecentOrdersByUser(user: User): Pair {
val zoneId = getZoneIdFromCountry(user.address.country)

val today = LocalDate.now(zoneId)
val yesterday = today.minusDays(1)

val todayOrder = getUserOrderByStatusAndDate(user, zoneId, date = today)
val yesterdayOrder = getUserOrderByStatusAndDate(user, zoneId, date = yesterday)

return yesterdayOrder to todayOrder
}
Вот оставшаяся часть кода, который используется в предыдущем методе

Код: Выделить всё

fun getUserOrderByStatusAndDate(
user: User,
zoneId: ZoneId,
status: OrderStatus = OrderStatus.CONFIRMED,
date: LocalDate = LocalDate.now(zoneId),
): Order? {
val (startDateTime, endDateTime) = getDateTimeRangeLocal(date, zoneId)
return orderRepository.findOrderByUserAndStatusAndOrderPlacedDate(
user = user,
status = status,
startDate = startDateTime,
endDate = endDateTime,
)
}

fun getDateTimeRangeLocal(date: LocalDate, zoneId: ZoneId): Pair {
val startDateTime = date
.atStartOfDay(zoneId)
.withZoneSameInstant(ZoneOffset.UTC)
.toOffsetDateTime()

val endDateTime = date
.atTime(23, 59, 59, 999_999_999)
.atZone(zoneId)
.withZoneSameInstant(ZoneOffset.UTC)
.toOffsetDateTime()

return startDateTime to endDateTime
}
findOrderByUserAndStatusAndOrderPlacedDate — это запрос в моем репозитории, вот он

Код: Выделить всё

@Query("SELECT o FROM Order o WHERE o.user = :user AND o.status = :status AND o.orderPlacedDate >= :startDate AND o.orderPlacedDate 

Подробнее здесь: [url]https://stackoverflow.com/questions/79290511/how-to-correctly-retrieve-yesterdays-order-in-africa-algiers-timezone-when-usin[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»