Как даты хранятся в postgres через Ecto (используя Timex)?
В моем приложении Phoenix я использую Ecto
с Timex
хранить мои даты в postgres
, Когда я показываю результаты конечному пользователю, я показываю дни в обратном порядке (т. Е. Сегодня вверху списка), а затем сортирую результаты в каждом дне в хронологическом порядке.
Чтобы это работало правильно, мне нужно применить часовой пояс пользователя перед обработкой сортировки. То, что я делал (до сих пор), это получение данных, преобразование дат с использованием Timex
а затем запустить сортировку на стороне клиента. Например, я мог бы сделать что-то вроде этого:
tz_user = Timex.Timezone.get( "Australia/Hobart", Timex.now )
captains_log = CaptainsLog.list_logs_for_user( current_user )
days = captains_log
|> Enum.map( fn (log) -> %Log{ log |
star_date: Timex.Timezone.convert( log.star_date, tz_user ),
end_transmission: Timex.Timezone.convert( log.end_transmission, tz_user )
} end)
|> Enum.group_by( fn ( log ) -> Timex.to_date(log.end_transmission) end )
|> Enum.sort( fn (e1, e2) ->
{ date1, _ } = e1
{ date2, _ } = e2
Timex.compare( date1, date2 ) >= 0
end)
Тем не менее, теперь я хотел бы достичь этой серверной части. Если я сделаю что-то вроде следующего:
select star_date at time zone 'AEST' from captains_log;
Дата не корректируется для моего часового пояса (как я и предполагал). Например, "8:48 утра" был сохранен в базе данных как "9:48 вечера" и отображается как "11:48 утра" в приведенном выше предложении выбора. AEDT
не намного лучше, результат "10:48 утра".
Вот что star_date
а также end_transmission
выглядит как на схеме:
field :star_date, Timex.Ecto.DateTime
field :end_transmission, Timex.Ecto.DateTime
Когда записи добавляются в базу данных, star_date
устанавливается до последнего end_transmission
, end_transmission
обычно устанавливается на Timex.now
,
Так как даты / время хранятся в postgres
от Ecto
? Могу ли я написать запрос на стороне сервера, который подстраивается под нужный часовой пояс? Часовой пояс для каждого пользователя может быть различным, что я могу передать до postgres
чтобы я мог сделать запрос для разных часовых поясов?