如何将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
相关产品推荐
相关产品推荐

