You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Phoenix中Ecto的updated_at转换为本地时区的12小时制格式?

Phoenix框架中Ecto时间戳转本地时区12小时制的简便方案

直接给你几个不用手动计算时间差的方法,都是框架或常用库自带的功能:

方法一:用Ecto原生时区转换

首先确认你的updated_at类型:如果是NaiveDateTime(不带时区),先把它关联到UTC时区,再转成你的本地时区,最后格式化:

# 转成UTC时区的DateTime
utc_dt = DateTime.from_naive!(updated_at, "Etc/UTC")
# 转换到你的目标时区,比如UTC-5对应的美国东部时区,用标识符更靠谱(自动处理夏令时)
local_dt = DateTime.shift_zone!(utc_dt, "America/New_York")
# 格式化12小时制
Calendar.strftime(local_dt, "%d-%m-%y %I:%M:%S %p")

如果你的updated_at本身就是带UTC时区的DateTime,直接跳过第一步,用shift_zone!转就行。

方法二:在Phoenix视图里封装成自定义函数(模板里直接用)

在对应模块的视图文件(比如lib/your_app_web/templates/post_view.ex)里写个工具函数,以后模板里直接调用:

def format_local_updated_at(datetime) do
  datetime
  |> DateTime.from_naive!("Etc/UTC")
  |> DateTime.shift_zone!("America/New_York")
  |> Calendar.strftime("%d-%m-%y %I:%M:%S %p")
end

模板里用的时候就这么写:

<%= format_local_updated_at(@post.updated_at) %>

方法三:用Timex库(如果项目已经在用)

如果你的项目依赖了Timex,代码会更简洁:

# 先确保mix.exs里加了依赖:{:timex, "~> 3.7"}
Timex.from_naive!(updated_at, "Etc/UTC")
|> Timex.shift_zone!("America/New_York")
|> Timex.format!("%d-%m-%y %I:%M:%S %p", :strftime)

注意点

  • 别用固定的-5小时偏移,建议用时区标识符(比如"America/New_York"、"Asia/Shanghai"),这类标识符会自动处理夏令时等时区变动,避免时间显示错误。
  • 所有操作都只在GUI渲染时处理,完全不会修改数据库里的存储内容。

内容的提问来源于stack exchange,提问作者William

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:44:57