0

在我的凤凰应用程序中,我一直在使用EctowithTimex将我的日期存储在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:48am”在数据库中存储为“9:48pm”,在上述选择语句中显示为“11:48am”。AEDT也好不到哪里去,结果是“上午 10:48”。

这是架构中的内容star_dateend_transmission外观:

field :star_date, Timex.Ecto.DateTime
field :end_transmission, Timex.Ecto.DateTime

将记录添加到数据库时,star_date设置为最后一个end_transmission. end_transmission通常设置为Timex.now

那么日期/时间如何存储在postgresby中Ecto?我可以编写一个调整到所需时区的服务器端查询吗?每个用户的时区可能不同,我可以传递什么postgres以便使查询适用于不同的时区?

4

0 回答 0