在我的凤凰应用程序中,我一直在使用Ecto
withTimex
将我的日期存储在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_date
和end_transmission
外观:
field :star_date, Timex.Ecto.DateTime
field :end_transmission, Timex.Ecto.DateTime
将记录添加到数据库时,star_date
设置为最后一个end_transmission
. end_transmission
通常设置为Timex.now
。
那么日期/时间如何存储在postgres
by中Ecto
?我可以编写一个调整到所需时区的服务器端查询吗?每个用户的时区可能不同,我可以传递什么postgres
以便使查询适用于不同的时区?