如何通过Ecto(使用Timex)将日期存储在postgres中?

时间:2018-03-01 12:50:35

标签: elixir ecto timex

在我的凤凰应用程序中,我一直在使用int [] myArray = {2,3}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)

我的时区没有调整日期(正如我所假设的那样)。例如," 8:48 am"存储在数据库中为" 9:48 pm"并显示为" 11:48 am"在上面的select语句中。 select star_date at time zone 'AEST' from captains_log; 并不是更好,结果是" 10:48 am"。

以下是架构中AEDTstar_date的样子:

end_transmission

将记录添加到数据库后,field :star_date, Timex.Ecto.DateTime field :end_transmission, Timex.Ecto.DateTime 将设置为最后一个star_dateend_transmission通常设置为end_transmission

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

0 个答案:

没有答案